我开始学习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)
没有帮助。
谢谢。
答案 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)