如何使用ghci在lambda中编写数字

时间:2009-10-28 18:05:52

标签: haskell ghci

我是Haskell的新手,使用Ghci。

我有一个名为three的函数,我想写成

let three =  \x->(\y->(x(x(x y)))) 

好的,这可行,但是当我尝试

three (2+) 4

它不起作用。相反,我得到了一些“无法构造无限类型”的错误。

请帮帮我。

2 个答案:

答案 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}}函数来执行指定次数的给定函数 - 这是制作完成后的下一步这个功能。