2016-06-03 3 views
-1

Может ли кто-нибудь помочь мне написать мою собственную версию функции ($)? Это моя попытка, которая не работает.

f function (x:xs) = f (x:xs) 
+2

Не предполагайте, что вторым аргументом будет список ... – comingstorm

+0

f function x = f (x)? Или я каким-то образом воспользуюсь словом? – Joanna

+1

Пожалуйста, не используйте имена типа 'function' или' list'. Имена должны описывать, что-то _does_, а не то, что это _is_ (для чего предназначены подписи, для которых вы должны всегда писать). Если вы не можете придумать правильное имя, тогда лучше назовите его просто 'foo' или даже' test' или что-то еще. – leftaroundabout

ответ

6

Во-первых, почему вы думаете, что вам нужно : или foldr здесь? Они являются исключительными для списков. $ не имеет ничего общего с списками.

f function (x) = f (x) больше нравится, однако, похоже, вы смущены тем, что вы определяете function с аргументом f или наоборот. На самом деле, f function (x) = f (x) означает следующее:

f = \function x -> f x 

т.е. вы определяете f как функцию, которая принимает аргумент называется function (что в действительности никогда не используется) и еще один аргумент x, к которому он затем применяет очень функцию, которую вы» re здесь прямо здесь ... такая рекурсивная привязка к узлу на самом деле возможна в Haskell (а иногда и весьма полезна), но в этом случае это не имеет никакого смысла.

То, что вы на самом деле хотите написать гораздо проще:

f $ x = f x 

отмечают, что $, потому что она состоит из символа не-буквы, является инфикс и поэтому разобран по-разному:

($) = \f x -> f x 

Это означает, что $ принимает функцию и аргумент и применяет функцию к аргументу; это оно.

Вы также могли бы добиться этого с именем с буквами, используя кавычку, чтобы он обрабатывается как инфикс:

f `function` x = f x 

... или просто

function f x = f x 
+0

И "." функция тогда является функцией 2 f x = f (x)? – Joanna

+0

№ 'f (x)' - просто неуклюжий способ записи 'f x', поэтому' function2' также эквивалентен '($)'. – leftaroundabout

+0

Должен ли я задать (.) Отдельный вопрос :)? – Joanna

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 $$ 
Смежные вопросы