Ответ 1
В Haskell обратная сторона превращает имя в оператор инфикса:
a `elem` b = elem a b
Итак,
(`elem` b) a = (\x -> x `elem` b) a
= a `elem` b
= elem a b
В то время как
(elem b) a = elem b a
Я пытаюсь понять разделы и думаю, что у меня это есть. В принципе, это способ применения частичного приложения к двоичным операторам. Поэтому я прекрасно понимаю все примеры (2*)
, (+1)
и т.д..
Но в книге "О'Реилли Реальный мир Хаскелл" раздел секций ":) он имеет этот пример:
(`elem` ['a'..'z']) 'f'
>True
Я понимаю необходимость скобок - т.е. синтаксис раздела. Но зачем нужны обратные ссылки?
Если я попытаюсь, я получаю:
(elem ['a'..'z']) 'f'
<interactive>:220:19:
Couldn't match expected type `[[Char]]' with actual type `Char'
In the second argument of `elem', namely 'f'
In the expression: (elem ['a' .. 'z']) 'f'
In an equation for `it': it = (elem ['a' .. 'z']) 'f'
В Haskell обратная сторона превращает имя в оператор инфикса:
a `elem` b = elem a b
Итак,
(`elem` b) a = (\x -> x `elem` b) a
= a `elem` b
= elem a b
В то время как
(elem b) a = elem b a