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

Haskell高阶函数。将两个函数作为参数传递。,haskell,functional-programming,Haskell,Functional Programming,我最近一直在自学Haskell,我的一个练习是实现一个函数,该函数将两个函数作为参数,并将数字3传递给第一个函数,将结果传递给第二个函数。我有更多的球拍经验。我为racket创建的函数是 (define (nestfun3 function function2) (function2 (function 3))) 我试图在racket中复制这个函数。 我知道只有一个函数作为参数的高阶函数可以是 twice function = function . function 如何传递两个函数?我

我最近一直在自学Haskell,我的一个练习是实现一个函数,该函数将两个函数作为参数,并将数字3传递给第一个函数,将结果传递给第二个函数。我有更多的球拍经验。我为racket创建的函数是

(define (nestfun3 function function2)
  (function2 (function 3)))
我试图在racket中复制这个函数。 我知道只有一个函数作为参数的高阶函数可以是

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
它会给它一个doyou(或者你可以使用ghcmod或任何东西)-我实际上刚刚重命名了类型参数(那些
t
很难看)

这样,它看起来应该和您在Scheme中所做的非常相似


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

在这种情况下,您所需要做的就是将
(define(FOO)BAR)
转换为
FOO=BAR
。Haskell对此任务有特殊支持。您只需说
foo=(.)