gpt4 book ai didi

haskell - 如何使用 Haskell 类型构造函数作为枚举?

转载 作者:行者123 更新时间:2023-12-02 12:53:29 26 4
gpt4 key购买 nike

我正在 Haskell 中编写一个使用查找表的程序。

例如。

type Table = [(Object, FilePath)]
data Object = Player { pName :: String }

我想以这样的方式构造它:Player 可以成为查找键:

[(Player, "data/players"), ...]

如果我添加另一个 Object 类型 Monster,我的表格可能如下所示:

[(Player, "data/players"), (Monster, "data/mons"), ...]

但是,我的 Table 类型定义表明我正在查找实例化对象,而实际上,我只想检查它是一种类型构造函数还是另一种类型构造函数。

我该如何去做呢?

编辑:

我想我想要这样的东西:

data ObjectType = Player | Monster | ...

但是有没有办法避免数据构造函数和类型构造函数的重复?

最佳答案

您实际上无法按照您描述的方式执行此操作。因为 Player 接受一个参数 (pName),所以 Player 本身的类型是 String -> Object,所以它无法正确适合您的Table 类型。

根据编辑中的建议,您可能应该专门为 Table 创建一个不带参数的单独枚举类型:

data ObjectType = PlayerType | MonsterType | ...

根据 Object 的其他构造函数的定义方式,您也许能够避免重复,例如

data Object = Object { objectType :: ObjectType, name :: String }

但这确实假设每种Object都只有一个name参数,而没有其他参数。

编辑:

经过反射(reflection),我想知道查找表结构首先是否有意义。您可以用以下内容替换表格:

lookupPath :: Object -> String
lookupPath (Player {}) = "data/players"
lookupPath (Monster {}) = "data/mons"
...

这种格式将使将表持久保存到磁盘之类的事情变得更加困难,但确实准确地捕捉到了您想要在没有参数的情况下匹配对象的意图。

(匹配的 Player {} 格式是匹配将来可能获取更多参数的构造函数的最佳方式,因为它使您无需在发生这种情况时更新匹配代码。 )

关于haskell - 如何使用 Haskell 类型构造函数作为枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21227875/

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