【发布时间】:2018-05-01 17:57:09
【问题描述】:
我正在为班级编写一个多米诺骨牌游戏,但我无法理解自定义类型。我有:
type DomsPlayer = Hand -> Board -> (Domino,End)
...
playTurn :: DomsPlayer -> (Int, Hand, Board)
playTurn hand1 board1 = (score, hand2, board2)
where (dom, end) = simplePlayer hand1 board1
board2 = resMaybe (playDom dom board1 end)
hand2 = remove dom hand1
score = scoreBoard board2
尝试加载它会给我错误:
Dominoes.hs:43:3: 错误:
• 无法匹配预期类型“(Int, Hand, Board)” 实际类型为“Board -> (Int, b0, Board)”
• “playTurn”的方程有两个参数, 但它的类型‘DomsPlayer -> (Int, Hand, Board)’只有一个
| 43 | playTurn hand1 board1 = (score, hand2, board2) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
Dominoes.hs:44:37: 错误:
• 无法匹配类型“Hand -> Board -> (Domino, End)” 与“[多米诺骨牌]”
预期类型:手 实际类型:DomsPlayer
• 可能原因:“hand1”应用于太少的参数
在‘simplePlayer’的第一个参数中,即‘hand1’
在表达式中:simplePlayer hand1 board1
在模式绑定中:(dom, end) = simplePlayer hand1 board1
| 44 | where (dom, end) = simplePlayer hand1 board1 |
如何从 DomsPlayer 中检索值?
【问题讨论】:
-
看起来DomsPlayer的定义是函数的类型同义词,而不是数据类型。
-
您的类型
DomsPlayer是两个参数(Hand和Board)的函数。您的函数playTurn将DomsPlayer函数作为参数并返回一个三元组。但是,playTurn的模式匹配有 2 个参数(hand1和board1)。这不适合在一起。 -
我给出了答案,但为了帮助你,我想知道你想做什么。你想收到
Hand和Board吗?或者你也想要(Domino, End)?显然你是在定义一个函数,因为DomsPlayer是函数的同义词。 -
我也想要一个(Domino,End)。
-
在我看来这是一个简单的类型不匹配。这应该是直截了当的混淆。我可以问一下为什么人们投票赞成吗?
标签: haskell