2010-10-22 3 views
1

я следующие данныезаявление Странный случай в Haskell

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

ответ

8

Применение функции имеет более высокий приоритет, чем :@: (или любой другой оператор инфиксного), так 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").

Смежные вопросы