sda*_*das 3 haskell types type-constructor
我在Haskell中编写了一个使用查找表的程序.
例如.
type Table = [(Object, FilePath)]
data Object = Player { pName :: String }
Run Code Online (Sandbox Code Playgroud)
我想以一种Player可以成为查找键的方式构造它:
[(Player, "data/players"), ...]
Run Code Online (Sandbox Code Playgroud)
如果我添加了另一种Object类型Monster,我的表可能如下所示:
[(Player, "data/players"), (Monster, "data/mons"), ...]
Run Code Online (Sandbox Code Playgroud)
但是,我的a类型定义Table表明我正在查找实例化对象,实际上,我只是想检查它是否是一个类型构造函数或另一个.
我该怎么做呢?
编辑:
我想我想要这样的东西:
data ObjectType = Player | Monster | ...
Run Code Online (Sandbox Code Playgroud)
但有没有办法避免重复数据构造函数和类型构造函数?
你不能以你描述的方式真正做到这一点.因为Player带一个参数(pName),Player它本身的类型是String -> Object,所以它不适合你的Table类型.
作为您的编辑建议,你应该做的无参数单独枚举类型专为Table:
data ObjectType = PlayerType | MonsterType | ...
Run Code Online (Sandbox Code Playgroud)
根据Object将如何定义其他构造函数,您可能能够避免重复,例如
data Object = Object { objectType :: ObjectType, name :: String }
Run Code Online (Sandbox Code Playgroud)
但这确实假设每种类型Object都只有一个name参数而没有别的.
编辑:
在反思时,我想知道查找表结构是否有意义.你可以用这个替换表:
lookupPath :: Object -> String
lookupPath (Player {}) = "data/players"
lookupPath (Monster {}) = "data/mons"
...
Run Code Online (Sandbox Code Playgroud)
这种格式会使诸如将表持久保存到磁盘之类的操作变得更加困难,但确实会捕获您想要在没有参数的情况下匹配对象的意图.
(Player {}匹配的格式是在将来可能获取更多参数的构造函数匹配的最佳方式,因为它可以避免在发生这种情况时更新匹配代码.)