Haskell 异常 : Prelude. Enum.().toEnum:错误的参数

标签 haskell

我有以下代码

import Data.List

data Card = One
          | Two
          | Three
          | Four
          | Five
          | Six
          | Seven
          | Eight
          | Nine
          | Ten
          | J
          | Q
          | K
          | A
          deriving (Show, Eq, Ord, Enum)

data Hand = Hand Card Card Card Card Card deriving(Show)

largestCard :: Hand -> Card
largestCard (Hand a b c d e) = One

但是,当我尝试在 GHCi 中使用 toEnum 3 时,我得到 Exception: Prelude.Enum.().toEnum: bad argument。如何解决这个问题?

最后一个函数只是一个虚拟函数。现在它什么也没做。

最佳答案

toEnum 的类型是

toEnum :: Enum a => Int -> a

GHCi 没有上下文来确定您想要在 toEnum 3 中使用哪个 Enum 实例,因此 by default它提供类型()。该类型只有一个值 (),因此除 0 之外的任何值都将无效。

以下是在 GHCi 中调用 toEnum 的一些示例:

λ> toEnum 0
()
λ> toEnum 1 :: Bool
True
λ> toEnum 3 :: Card
Four

您还可以使用type applications :

λ> :set -XTypeApplications
λ> toEnum @Bool 1
True
λ> toEnum @Card 3
Four

关于Haskell 异常 : Prelude. Enum.().toEnum:错误的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58906601/

相关文章:

haskell - 如何使用类型同义词重载运算符?

haskell - 为自定义镜头编写类别实例

haskell - 在 Haskell 中生成随机数

haskell - Haskell 中的并行性

haskell - 我可以一般地计算类型的基数吗?

haskell - 我怎样才能让这个 Haskell ADT 派生 Show?

haskell - Haskell中有诸如 "type extensions"之类的东西吗?

haskell - 在 Haskell 中生成相同元素的无限列表

compiler-construction - Haskell编译时函数计算

haskell - 自由单子(monad)总是存在吗?