稍后将 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

所以我的问题是为什么分配 AscDesc 会导致编译器错误?

使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