Haskell - 类型的问题

时间:2015-05-23 13:06:13

标签: haskell types

我开始学习Haskell并遇到问题。我尝试理解lambda并创建了函数mo06

mo06 f x = if f x
           then x
           else x * x

我可以在ghci中调用它:

λ mo06 (== 1) 1
1
λ mo06 (== 1) 3
9 

这没关系 - 没有问题也没有问题,但是......

...我想把我的功能写成

mo08 f = fac (\x ->  if f x then x else x * x)

其中

fac表示阶乘:

fac :: Num a => Int -> Int
fac n
  | n == 0    = 1
  | n > 0     = n * fac (n-1)
  | otherwise = error "fac only defined on natural numbers"

并将其称为之前的

mo08 (==1) 3

我尝试了一个错误:

  

无法匹配预期类型'a - > a'与实际类型'Int'。

fac更改为(fromIntegr fac)没有帮助。

谢谢。

2 个答案:

答案 0 :(得分:0)

你必须移动fac一个:

mo08 f = \xx -> fac (if f (xx) then xx else xx * xx)

或(如果您愿意)将xx移到=的左侧:

mo08 f xx = fac $ if f (xx) then xx else xx * xx

看看为什么只看\xx -> ... - 这将是一个函数 - 这里需要Int并生成Int - 与fac :: Int -> Int相同 - 所以当你尝试fac (\xx -> ...)实际上是在尝试将函数插入fac(这就是错误试图告诉你的内容) - 但是如果你将fac移到lambda的定义中它会起作用。

使用组合

当然也许你试过使用函数组合:

mo08 f = fac . (\xx -> if f (xx) then xx else xx * xx)

但是你可以看到你需要使用合成运算符(.);)

答案 1 :(得分:0)

lambda表达式(类型a -> a)不是整数,但在mo08中你试图在其上调用fac - 而fac期望int 1}}。您需要将fac调用放在最终结果上:

mo08 f = (\xx -> fac (if f xx then xx else xx * xx))

或者使用功能组合:

mo08 f = fac . (\xx -> if f xx then xx else xx * xx)