【问题标题】:Extracting values from Haskell type synonyms从 Haskell 类型同义词中提取值
【发布时间】: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 是两个参数(HandBoard)的函数。您的函数 playTurnDomsPlayer 函数作为参数并返回一个三元组。但是,playTurn 的模式匹配有 2 个参数(hand1board1)。这不适合在一起。
  • 我给出了答案,但为了帮助你,我想知道你想做什么。你想收到HandBoard 吗?或者你也想要(Domino, End)?显然你是在定义一个函数,因为DomsPlayer 是函数的同义词。
  • 我也想要一个(Domino,End)。
  • 在我看来这是一个简单的类型不匹配。这应该是直截了当的混淆。我可以问一下为什么人们投票赞成吗?

标签: haskell


【解决方案1】:

如果你用它的定义替换这个DomsPlayer

type DomsPlayer = Hand -> Board -> (Domino,End)

playTurn :: (Hand -> Board -> (Domino,End)) -> (Int, Hand, Board)

你会看到 playTurn 只接收一个参数,而不是两个。

我不知道您要做什么,但显然您需要接收 HandBoard 作为单独的参数:

playTurn :: Hand -> Board -> ... -> (Int, Hand, Board)

我不知道,也许也传递一个DomsPlayer 类型的函数,并将其应用于这些单独的参数。

但那是你的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    相关资源
    最近更新 更多