我是Haskell的新手,使用Ghci。
我有一个名为three的函数,我想写成
let three = \x->(\y->(x(x(x y))))
好的,这可行,但是当我尝试
时three (2+) 4
它不起作用。相反,我得到了一些“无法构造无限类型”的错误。
请帮帮我。
答案 0 :(得分:6)
ghci> let three = \x->(\y->(x(x(x y))))
ghci> three (2+) 4
10
ghci> three return "deconstructivist"
<interactive>:1:6:
Occurs check: cannot construct the infinite type: t = m t
Expected type: t
Inferred type: m t
In the first argument of 'three', namely 'return'
In the expression: three return "deconstructivist"
ghci> :t three
three :: (t -> t) -> t -> t
ghci> :t return
return :: (Monad m) => a -> m a
three (2+) 4
示例有效!更好地检查您提供的示例是否真实地重现了您的问题。return
一样,事情是返回的结果与给定的类型不同。如果类型相同,它将是无限的(和* -> * -> * -> ...
),Haskell不支持。答案 1 :(得分:0)
您提供的示例确实有效。让我们解释一下原因:
three f = f . f . f
-- so...
three :: (a -> a) -> a -> a
该函数需要具有类型a -> a
,因为它将接收它自己的参数,这需要一个类型。 (2+)
的类型为Num a => a -> a
,因此three (2+) 4
可以正常使用。
但是,当您传递类型为return
的{{1}}函数(返回不同的类型)时,它将与我们设置的Monad m => a -> m a
要求不匹配。这是你的功能失败的地方和时间。
在您熟悉它的同时,尝试使用类型为(a -> a)
的{{1}}函数来执行指定次数的给定函数 - 这是制作完成后的下一步这个功能。