稍后将Asc / Desc分配给变量会导致编译器错误

时间:2016-05-28 11:34:57

标签: haskell yesod

当我尝试使用以下内容时出现编译错误:

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会导致编译错误?

1 个答案:

答案 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