当我尝试使用以下内容时出现编译错误:
WebSocket
如果我更改此行,它将起作用:
getOrder :: Text -> SelectOpt Event
getOrder text =
case text of
"id" -> direction EventId
"title" -> direction EventTitle
where direction = if text == "id" then Desc else Asc
如果我更改where direction = Asc
也一样 - 它会起作用:
case
所以我的问题是为什么分配case text of
"id" -> Desc EventId
"title" -> Asc EventTitle
和Asc
会导致编译错误?
答案 0 :(得分:2)
使direction
成为一个函数并将其移至顶层:
direction text = if text == "id" then Desc else Asc
请参阅此SO答案中的updown
功能:
https://stackoverflow.com/a/37380039/866915
<强>更新强>
为了让direction EventId
有意义,direction
必须有类型:
direction :: EntityField Event Int
为了使direction EventTitle
有意义,它必须具有类型:
direction :: EntityField Event String
因此,如果像
这样的where子句中定义了direction
where direction = if ... then Asc else Desc
它不能满足两种类型约束。但是,如果你使它成为一个函数:
direction t = if t == "id" then Asc else Desc
然后它是多态的。这意味着direction ...
在不同的呼叫站点可以有不同的类型。
<强>更新强>
要使用原始代码,请尝试添加类型签名:
where
direction :: EntityField r t -> SelectOpt r
direction = if text == "id" then Desc else Asc