我最近一直在教自己Haskell,我的一个练习是实现一个函数,它接受两个函数作为参数,并将第3个函数传递给第一个函数,将结果传递给第二个函数。我有更多的球拍经验。我为球拍创建的功能是
(define (nestfun3 function function2)
(function2 (function 3)))
我试图在球拍中复制这个功能。 我知道只有一个函数作为参数的高阶函数可以像
twice function = function . function
我如何传递两个功能?我试过了
twice function = function . function
three function = function . twice
答案 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
中所做的非常相似当然,您可能希望在重命名时确保不交换功能:|