haskell 具有相同字段名的数据类型

vwoqyblh  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(77)

我在用Haskell编写更大的程序时遇到了麻烦,其中一个问题是当我用相同或匹配的字段名定义数据类型时会出现模棱两可的错误。

data Board  = Board  { width :: Int, height :: Int }
data Player = Player { strength :: Int, width :: Int, height :: Int }

我对编写小程序很满意,但当我发现这个问题时,我会逃跑和绝望。
在其他语言中,我可以这样做:

board.width  = 100;
board.height = 100;

player.width = 5;
player.height = 2;

我发现我可以在每个字段名称前面加上类型名称(即boardWith,playerWidth),但这是最好的方法和良好的实践吗?我该怎么办?

3vpjnl9f

3vpjnl9f1#

为字段提供唯一的前缀是一种有效的方法。这在Haskell中是一个已知的问题,有几种方法可以解决这个问题。
最复杂的解决方案之一是vinyl,它基本上实现了一个新的记录系统(或者几个,取决于你如何看待它)-允许你在记录之间共享字段,甚至提供了“子类型”的概念。根据您对Haskell的熟悉程度,它可能不一定容易使用。不过,你一定要去看看。

ztyzrc3y

ztyzrc3y2#

一种选择是保持数据类型不变,并创建一些函数,如:

data Board  = Board  { width :: Int, height :: Int }

boardWidth :: Board -> Int
boardWidth (Board w _) = w

相关问题