gpt4 book ai didi

haskell - 值(value)约束

转载 作者:行者123 更新时间:2023-12-04 14:33:16 24 4
gpt4 key购买 nike

假设我们有以下数据类型:

data Cmd = Cmd0 Opcode | Cmd1 Opcode Arg | Cmd2 OPcode Arg Arg
data Opcode = NOP | INC | ADD | MUL deriving (Enum)
data Arg = W32 Int | W16 Int | W8 Int

这个想法是有一个产生顺序操作码编号的操作码类型。有没有办法为 Cmd 值指定一个约束,比如:Cmd0 只有 NOP 操作码,Cmd1 只有 INC,
Cmd2 只是 ADD 或 MUL 值。我尝试使用 GATD,但它们按类型而不是值操作。

反之亦然,有没有办法为 Cmd 的每个值生成一个连续的操作码,而无需
手动或不使用 TH 为每个值声明 fromEnum 方法?

最佳答案

您可以使用单独的 OpCode类型:

data Opcode0 = NOP
data Opcode1 = INC
data Opcode2 = ADD | MUL

data Cmd = Cmd0 Opcode0 | Cmd1 Opcode1 Arg | Cmd2 Opcode2 Arg Arg

现在有时您可能希望将所有操作码视为单一类型,例如将它们放在一个列表中。为此,您可以为 Opcode 类型使用类型类并使用 existential types :
class OpcodeCl a where --empty classes seem to be allowed (in GHC at least)
instance OpcodeCl Opcode0 where
instance OpcodeCl Opcode1 where
instance OpcodeCl Opcode2 where

data Opcode = forall a . (OpcodeCl a) => Op { unOp :: a }

我怀疑你不能用 Opcode 做任何事情在这里,因为类 OpcodeCl没有方法。您可以将有用的方法添加到 OpcodeCl , 与 Int 相互转换s,例如。

关于haskell - 值(value)约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8374332/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com