【问题标题】:Haskell, using function with list comprehensionsHaskell,使用带有列表推导的函数
【发布时间】:2019-11-04 07:07:38
【问题描述】:

我正在努力完成以下工作:

slice :: Int -> Int -> [a] -> [a]
slice from to xs = take (to - from + 1) (drop from xs)

trimBoard :: Board -> Int -> Board
trimBoard s y = slice ((y*3)) (((y+1)*3)-1) s

getBox :: Board -> Int -> Int -> [Sequence]
getBox s y x = [ (trimBoard c x) | c <- (trimBoard s y)]

具体来说,我正在尝试运行一个函数,获取结果[[int]],然后将另一个函数映射到该结果上。哪个 haskell 显然令人厌恶,我需要结合使用“lambda 函数”和其他我根本无法阅读或理解的魔法来实现这一点。

有什么简单的方法可以做到这一点,不需要 7 个月的数学函数语法课程?

如上所述,结果board是[[int]],sequence就是[int]。

它产生的错误是

sudoku.hs:139:19: error:
    • Couldn't match type ‘[Int]’ with ‘Int’
      Expected type: Sequence
        Actual type: Board
    • In the expression: (trimBoard c x)
      In the expression: [(trimBoard c x) | c <- (trimBoard s y)]
      In an equation for ‘getBox’:
          getBox s y x = [(trimBoard c x) | c <- (trimBoard s y)]

sudoku.hs:139:29: error:
    • Couldn't match type ‘Int’ with ‘[Int]’
      Expected type: Board
        Actual type: Sequence
    • In the first argument of ‘trimBoard’, namely ‘c’
      In the expression: (trimBoard c x)
      In the expression: [(trimBoard c x) | c <- (trimBoard s y)] Failed, modules loaded: none.

【问题讨论】:

  • 除非Board 是Sequence 的同义词,否则您的类型不会一致。
  • getBox s y x = [ (trimBoard c x) | c &lt;- (trimBoard s y)] 被 ghc 拒绝,出现大量我不理解的错误。我认为他们抱怨 x 应该是一个 int,但不知何故变成了一个 [int],但我不确定。
  • 请编辑您的问题并添加错误。还要添加Board 和Sequence 类型的定义。这是为了未来的读者和可搜索性。
  • c 在表达式c &lt;- (trimBoard s y) 的类型为[Int],但trimBoard 的第一个参数需要类型Board,即[[Int]],不匹配。另外,getBox 终于有类型[Board] 而不是[Sequence]`。
  • @RNPF,列表理解[ ... | c &lt;- trimBoard... ] 表示对于每个元素 c 的列表trimBoard。所以c 具有您要绑定到的任何列表的 元素类型。

标签: haskell


【解决方案1】:

看来您已经正确编写了所有功能代码,但没有正确指定类型签名。 trimBoard 期望 Board 作为它的第一个参数,但您已将 c 传递给它,这是单行。

您可能抱怨的是 trimBoard 如果您将其传递一排而不是一整块板,它应该可以很好地工作。确实如此,你只需要学会这样说:

trimBoard :: [a] -> Int -> [a]

也就是说,trimBoard 采用 any 类型的列表和 Int,并返回相同类型的列表。现在您不再局限于传递Int 列表,一切正常。

您也可以省略trimBoard 的类型签名,Haskell 会推断出这个,​​这是最通用的。 (但编写类型签名并学习如何这样做是件好事——事实上,通过实践,这成为我非常想念其他语言的宝贵工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2011-07-24
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多