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

Aug*_*res 2 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
Run Code Online (Sandbox Code Playgroud)

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

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

Kot*_*lar 9

的类型toEnum

toEnum :: Enum a => Int -> a
Run Code Online (Sandbox Code Playgroud)

GHCi没有上下文来确定Enum您想要的实例toEnum 3,因此默认情况下它将提供类型()。该类型只有一个值,()因此任何东西0都将无效。

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

?> toEnum 0
()
?> toEnum 1 :: Bool
True
?> toEnum 3 :: Card
Four
Run Code Online (Sandbox Code Playgroud)

您还可以使用类型应用程序

?> :set -XTypeApplications
?> toEnum @Bool 1
True
?> toEnum @Card 3
Four
Run Code Online (Sandbox Code Playgroud)