![](/img/trans.png)
[英]Skyline in haskell, probably cause ´function´is applied to too few arguments
[英]Function is applied to too few arguments in haskell
我刚刚开始学习haskell,但无法解决此问题。 有人可以告诉我为什么我在以下代码中将g
应用于过少的参数时出错。
f :: Int -> Int
f first = 5+first
g :: Int -> Int -> Int
g first second = first+second
compute :: (Int -> Int) -> (Int -> Int -> Int) -> Int -> Int -> Int
compute f g x y = (f . g) x y
一个常见的错误是认为函数组合运算符.
传递“根据需要的参数”。 但是事实并非如此:它仅使一个参数通过。
所以当你写
(f . g) x y
您可能希望这意味着
f (g x y)
但这实际上意味着
f (g x) y
-即y
被传递给f
作为第二个参数,而不是g
。 哎呀!
首先,看看f . g
的定义f . g
f . g
:
f . g = \x -> f (g x)
然后,我们可以扩展compute
的定义,如下所示:
compute f g x y = (f . g) x y
= (\z -> f (g z)) x y
= (f (g x)) y
= (5 + (g x)) y
gx : Int -> Int
,没有Num
实例,因此您不能将其添加到5中。
问题是您希望在将结果传递给f
之前将g
应用于x
和 y
。 为此,您需要的不仅仅是简单的合成。 最简单的编写方法是直接:
compute f g x y = f (g x y)
如果您的目标是更轻松一点,那么您就需要看一下以下内容:
compute f g = \x -> \y -> f (g x y)
-- application is left-associative
= \x -> \y -> f ((g x) y)
-- def'n of (.)
= \x -> f . (g x)
-- eta abstraction
= \x -> (\z -> f . z) (g x)
-- def'n of an operator section
= \x -> (f .) (g x)
-- def'n of (.)
= (f .) . g
如果您想完全没有意义,可以编写
compute = (.) . (.)
您可以将合成运算符与其自身组合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.