我有以下数据
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
函数应用程序具有比:@:(或任何其他中缀运算符)更高的优先级,因此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").