Haskell中的奇怪案例陈述

Azi*_*ibo 1 syntax haskell

我有以下数据

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

app inp = case inp of
     a1 :@: a2 -> (C1 "a") :@: (C1 "b")
     _         -> C1 "c"
Run Code Online (Sandbox Code Playgroud)

为什么案例会返回输入而不是(C1 "a") :@: (C1 "b")

*Test> app (C1 "c") :@: (C1 "d")
C1 "c" :@: C1 "d"
Run Code Online (Sandbox Code Playgroud)

如果我改变A :@: A,工作正常C2 A A

Tra*_*own 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"
Run Code Online (Sandbox Code Playgroud)

一种更为惯用的写作方式是app $ (C1 "c") :@: (C1 "d").