问题
Could someone help me with writing my own version of the ($) function?
This is my attempt which does not work.
f function (x:xs) = f (x:xs)
回答1:
First, why do you think you need : or foldr here? These are exclusive to lists. $ has nothing to do with lists.
f function (x) = f (x) is more like it, however it seems you're confused about whether you defining function with f as an argument, or vice versa. In fact, f function (x) = f (x) means this:
f = \function x -> f x
i.e. you're defining f as a function which takes an argument called function (that is never actually used) and another argument x to which it then applies the very function you're defining right here... this kind of recursive knot-tying is actually possible in Haskell (and sometimes quite useful), but in this case it doesn't make any sense.
What you actually want to write is much simpler:
f $ x = f x
note that $, because it consists of a non-letter symbol, is an infix and therefore parsed differently:
($) = \f x -> f x
Which means, $ takes a function and an argument and applies the function to the argument; that's it.
You could also achieve this with a name with letters by using backticks to have it parsed as an infix:
f `function` x = f x
...or simply
function f x = f x
回答2:
% 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 $
So lets just copy and paste, defining our own $$ (borrowing the logic from the discussion already presented by @leftaroundabout):
($$) :: (a -> b) -> a -> b
f $$ x = f x
infixr 0 $$
来源:https://stackoverflow.com/questions/37623871/haskell-write-your-version-of-a-function