Haskell高阶函数。将两个函数作为参数传递。

时间:2015-10-28 17:06:32

标签: haskell functional-programming

我最近一直在教自己Haskell,我的一个练习是实现一个函数,它接受两个函数作为参数,并将第3个函数传递给第一个函数,将结果传递给第二个函数。我有更多的球拍经验。我为球拍创建的功能是

(define (nestfun3 function function2)
  (function2 (function 3)))

我试图在球拍中复制这个功能。 我知道只有一个函数作为参数的高阶函数可以像

twice function = function . function

我如何传递两个功能?我试过了

twice function = function . function
three function = function . twice 

1 个答案:

答案 0 :(得分:5)

直接翻译将是:

apply3 :: Num a => (a -> b) -> (b -> c) -> c
apply3 f g = g (f 3)

记住:你不想只是编写函数 - 你想首先应用3然后将结果应用到另一个函数

抱歉混音......现在应该可以了:

λ> let f = (+1)
λ> let g = (*2)
λ> apply3 f g
8
λ> apply3 g f
7

万一你想知道 - 你不必真正开始签名(尽管添加它是好习惯) - 如果你在ghci中这样做:

λ> let apply3 f g = g (f 3)
λ> :t apply3
apply3 :: Num a => (a -> t1) -> (t1 -> t) -> t

它会给你它(或者你可以使用ghc-mod或其他) - 我实际上只是重命名了类型参数(那些t很难看)

这种方式应该与您在Scheme

中所做的非常相似

当然,您可能希望在重命名时确保不交换功能:|