繁体   English   中英

函数应用于haskell中的参数太少

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM