稍后将 Asc/Desc 分配给变量会导致编译器错误
Assigning Asc/ Desc to variable later causes a compiler error
当我尝试使用类似以下内容时出现编译器错误:
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
和 Desc
会导致编译器错误?
使direction
成为一个函数并将其移动到顶层:
direction text = if text == "id" then Desc else Asc
请参阅此 SO 答案中的 updown
函数:
更新
为了使 direction EventId
有意义,direction
必须具有类型:
direction :: EntityField Event Int
为了使 direction EventTitle
有意义,它必须具有以下类型:
direction :: EntityField Event String
所以如果 direction
是在像这样的 where 子句中定义的
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
当我尝试使用类似以下内容时出现编译器错误:
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
和 Desc
会导致编译器错误?
使direction
成为一个函数并将其移动到顶层:
direction text = if text == "id" then Desc else Asc
请参阅此 SO 答案中的 updown
函数:
更新
为了使 direction EventId
有意义,direction
必须具有类型:
direction :: EntityField Event Int
为了使 direction EventTitle
有意义,它必须具有以下类型:
direction :: EntityField Event String
所以如果 direction
是在像这样的 where 子句中定义的
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