Странное утверждение в Haskell - PullRequest
1 голос
/ 22 октября 2010

У меня есть следующие данные

data A = C1 String | A :@: A
         deriving(Show)  

app inp = case inp of
     a1 :@: a2 -> (C1 "a") :@: (C1 "b")
     _         -> C1 "c"

Почему регистр возвращает ввод вместо (C1 "a") :@: (C1 "b")?

*Test> app (C1 "c") :@: (C1 "d")
C1 "c" :@: C1 "d"

Работает нормально, если я изменю A :@: A на C2 A A

1 Ответ

8 голосов
/ 22 октября 2010

Приложение функции имеет более высокий приоритет, чем :@: (или любой другой инфиксный оператор), поэтому app (C1 "c") :@: (C1 "d") совпадает с (app (C1 "c")) :@: (C1 "d"), а не app ((C1 "c") :@: (C1 "d")). Последний делает то, что вы ожидаете:

*Main> app ((C1 "c") :@@: (C1 "d"))
C1 "a" :@@: C1 "b"

Более идиоматический способ написать это app $ (C1 "c") :@: (C1 "d").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...