有人可以帮我编写自己的($)
函数版本吗?
这是我的尝试不起作用。
f function (x:xs) = f (x:xs)
答案 0 :(得分:6)
首先,为什么您认为这里需要:
或foldr
?这些是列表专有的。 $
与列表无关。
f function (x) = f (x)
更像是它,但是您似乎对于将function
定义为f
作为参数感到困惑,反之亦然。事实上,f function (x) = f (x)
意味着:
f = \function x -> f x
即。你将f
定义为一个函数,它接受一个名为function
的参数(实际上从未使用过)和另一个参数x
,然后它应用你正确定义的函数在这里......这种递归打结在Haskell中实际上是可行的(有时非常有用),但在这种情况下它没有任何意义。
你真正想要写的东西要简单得多:
f $ x = f x
请注意$
,因为它由非字母符号组成,是一个中缀,因此解析不同:
($) = \f x -> f x
这意味着,$
接受一个函数和一个参数,并将该函数应用于参数;就是这样。
你也可以使用反引号用字母名称来实现这一点,将其解析为中缀:
f `function` x = f x
......或者只是
function f x = f x
答案 1 :(得分:4)
% ghci
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help
Prelude> :i ($)
($) :: (a -> b) -> a -> b -- Defined in ‘GHC.Base’
infixr 0 $
所以我们只需复制和粘贴,定义我们自己的$$
(借用@leftaroundabout已经提出的讨论中的逻辑):
($$) :: (a -> b) -> a -> b
f $$ x = f x
infixr 0 $$