Может ли кто-нибудь помочь мне написать мою собственную версию функции ($)
? Это моя попытка, которая не работает.
f function (x:xs) = f (x:xs)
Может ли кто-нибудь помочь мне написать мою собственную версию функции ($)
? Это моя попытка, которая не работает.
f function (x:xs) = f (x:xs)
Во-первых, почему вы думаете, что вам нужно :
или 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
И "." функция тогда является функцией 2 f x = f (x)? – Joanna
№ 'f (x)' - просто неуклюжий способ записи 'f x', поэтому' function2' также эквивалентен '($)'. – leftaroundabout
Должен ли я задать (.) Отдельный вопрос :)? – Joanna
% 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 $$
Не предполагайте, что вторым аргументом будет список ... – comingstorm
f function x = f (x)? Или я каким-то образом воспользуюсь словом? – Joanna
Пожалуйста, не используйте имена типа 'function' или' list'. Имена должны описывать, что-то _does_, а не то, что это _is_ (для чего предназначены подписи, для которых вы должны всегда писать). Если вы не можете придумать правильное имя, тогда лучше назовите его просто 'foo' или даже' test' или что-то еще. – leftaroundabout