Lui*_*eda 2 haskell functional-programming
我最近一直在教自己Haskell,我的一个练习是实现一个函数,它接受两个函数作为参数,并将第3个函数传递给第一个函数,将结果传递给第二个函数.我有更多的球拍经验.我为球拍创建的功能是
(define (nestfun3 function function2)
(function2 (function 3)))
Run Code Online (Sandbox Code Playgroud)
我正试图在球拍中复制这个功能.我知道只有一个函数作为参数的高阶函数可以是
twice function = function . function
Run Code Online (Sandbox Code Playgroud)
我怎样才能通过两个功能?我试过了
twice function = function . function
three function = function . twice
Run Code Online (Sandbox Code Playgroud)
直接翻译将是:
apply3 :: Num a => (a -> b) -> (b -> c) -> c
apply3 f g = g (f 3)
Run Code Online (Sandbox Code Playgroud)
记住:你不想只是编写函数 - 你想先应用3然后将结果应用到另一个函数
对不起混合......现在应该可以了:
?> let f = (+1)
?> let g = (*2)
?> apply3 f g
8
?> apply3 g f
7
Run Code Online (Sandbox Code Playgroud)
万一你想知道 - 你不必真正开始签名(虽然这是添加它的好习惯) - 如果你在ghci中这样做:
?> let apply3 f g = g (f 3)
?> :t apply3
apply3 :: Num a => (a -> t1) -> (t1 -> t) -> t
Run Code Online (Sandbox Code Playgroud)
它会给你它(或者你可以使用ghc-mod或其他) - 我实际上只是重命名了类型参数(那些t是丑陋的)
这样它看起来应该和你在Scheme中做的非常相似
当然,您可能希望在重命名时确保不交换功能:|