当前位置:  开发笔记 > 小程序 > 正文

识别haskell类型

如何解决《识别haskell类型》经验,为你挑选了1个好方法。

我在理解haskell中的类型方面遇到了一些困难.让我们考虑以下函数并查看它们的类型.

reduce f s [] = s
reduce f s (x:xs) = f x (reduce f s xs)

for m n f s = if m>n then s else for (m+1) n f ( f m s )

comp f g x y = f x (g x y)

iter 0 f s = s
iter n f s = iter (n-1) f (f s)

我们有类似的东西:

reduce :: (t1 -> t -> t) -> t -> [t1] -> t
for :: (Ord a, Num a) => a -> a -> (a -> t -> t) -> t -> t
comp :: (t -> t2 -> t3) -> (t -> t1 -> t2) -> t -> t1 -> t3
iter :: (Num t) => t -> (t1 -> t1) -> t1 -> t1

我不清楚的是,在reduce函数中f取两个参数,而for函数f再取两个参数.我只能看到它只需要一个.好吧,如果它会是这样的:

for m n f s = if m>n then s else for (m+1) n f m n

更明显和容易认识到f确实需要两个参数.

我想知道是否存在一些方法或方法来推断haskell中函数的类型.除了这些例子,我还会提出一些不同的例子,以便我能克服这种困难.

编辑:在我的情况下给出函数定义,我只是想推断它们的类型



1> leftaroundab..:

你在思考错误的地方甚至在考虑f ( f m s ).这不是for定义的子表达式:回想一下,函数应用程序是从左边解析的.所以

for (m+1) n f ( f m s )
 ? (for (m+1)) n f ( f m s )
 ? (for (m+1) n) f ( f m s )
 ? (for (m+1) n f) ( f m s )
 ? (for (m+1) n ) (f ( f m s ))
 ? for (m+1) (n f ( f m s ))
 ? for ((m+1) n f ( f m s ))

最后的不等式可能是最明显的,因为你将函数(m+1)应用于三个参数......这看起来很不可能.

如果您需要任何"心理括号"来理解函数,通常最好将它们放在每个函数参数周围:

for (m+1) n f ( f m s )
 ? for (m+1) 
       (n)
       (f)
       (f m s)

而且,如果这对你有帮助,因为它看起来更像你在主流语言中所拥有的,你也可以解决所有问题:

 ? for ( m+1, n, f, f(m,s) )

(虽然你最好快点忘掉那个)


顺便说一句:如果你看到一个函数只应用于一个参数,那并不意味着函数类型只有一个参数.事实上,Haskell的语法的主要优势在于您可以轻松地进行部分应用:例如

前奏>:t take
take :: Int - > [a] - > [a]
Prelude>:t take 3
take 3 :: [a] - > [a]
Prelude> map(take 3)["looooong","甚至更长","非常长""
["loo","eve","ter"]

你看我只应用take了一个参数,另一个参数自动从列表中取出map.

另一个例子,有操作员部分,

前奏>:t(+)
(+):: Num a => a - > a - > a
Prelude>:t(+ 1)
(+ 1):: Num a => a - > a
Prelude> map(+ 1)[4,5,6]
[5,6,7]

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有