我最近一直在自学Haskell,我的练习之一是实现一个函数,该函数将两个函数作为参数并将数字3传递给第一个函数,并将结果传递给第二个函数。我在球拍方面有更多经验。我为球拍创建的功能是
(define (nestfun3 function function2)
(function2 (function 3)))
我正在尝试在球拍中复制此功能。我知道只有一个函数作为参数的高阶函数可以像
twice function = function . function
如何传递两个功能?我试过了
twice function = function . function
three function = function . twice
直接翻译为:
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中所做的非常相似
当然,您可能想确保重命名时不交换功能:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句