【问题标题】:How to divide a list by a variable haskell如何通过变量haskell划分列表
【发布时间】:2018-01-08 12:16:46
【问题描述】:

做一个小项目,但经过几个小时的工作,我仍然无法弄清楚如何将列表中的每个元素除以变量

diver xs = map divhs j
       where divhs = div hs
                hs = tupleTest1 xs
                 j = jot xs

不会工作,也不会

 map (/ j) hs

欢迎任何人提供帮助

真的是你的 哈斯克尔磨砂

【问题讨论】:

  • 请提供完整的例子+错误信息
  • map (div 2) [1,2,3,4,5,6] 评估为 [0,1,1,2,2,3],但从您的代码来看就像你正在尝试做一些更复杂的事情......
  • 好吧,map (/ j) hs 肯定会起作用,前提是j 是一个可整除的数字,hs 是这些数字的列表。显然问题出在其他地方,例如hs 不是数字列表。总是给你的函数类型签名,所以你会在它们所在的地方看到错误,而不是在完全不同的地方。 (此外,请始终使用类型签名,因为它们使您更容易理解您的代码应该做什么。)
  • 可能与您的问题无关,但请注意,给出的代码甚至没有解析。你不能像这样缩进 Haskell 代码; where 块中的所有绑定必须以相同的缩进开始。 (如果你想让它们排成一行,你可以在 = 之前添加空格,尽管我敢说这通常不是一个相当糟糕的主意。)
  • 那么请使用 SSH,或 FTP,或哎呀,电子邮件或其他任何方式在两台计算机之间移动代码。如果您发布的代码有全新的问题,并且可能包含真正的问题,我们应该如何分析问题?

标签: list haskell division


【解决方案1】:
 where divhs = div hs
          hs = tupleTest1 xs
           j = jot xs

这不是正确的缩进。每行的第一个非空格字符(where 之后)才是最重要的。由于每一行开始时都比前一行缩进更多,因此整个 where 块被解析为就好像它在一行上一样。

   where divhs = div hs hs = tupleTest1 xs j = jot xs

因此,会出现错误,尤其是因为 hsj 被解析为附加参数,并且该行上有太多 = 符号。

【讨论】:

    【解决方案2】:

    您对map 的建议应该有效。
    请参阅下面我在 ghci 中的示例:

    Prelude> let mylist = 1:2:3:4:5:[]
    Prelude> mylist
    [1,2,3,4,5]
    Prelude> let diver xs d = map (/ d) xs
    Prelude> diver mylist 2
    [0.5,1.0,1.5,2.0,2.5]
    Prelude>
    

    或使用您的简短版本

    Prelude> map (/ 2) mylist
    [0.5,1.0,1.5,2.0,2.5]
    

    根据您的 cmets 和您的错误消息

     couldn't match expected type '[[int]]' with actual type int - * In the second argument of map' , namely j' - In the expression: map divhs j 
    

    问题在于输入变量 j 不是您期望的 int,而是一个 int 列表列表。
    因此问题可能在于您的函数jot,因为您将j 设置为where j = jot xs


    您说jot 会返回一个数字。我会推荐

    • 尝试手动输入参数时diver 是否有效
    • 确保jot 实际上不会返回类似[[1337]] 的内容。如果它实际上返回一个列表列表(如错误消息所示),但您认为它只是一个数字,那么它可能只是一个包含在列表列表中的单个 int。

    如果是第二个要点,您可以将其解压缩作为快速修复(但最好修复您的 jot 代码):

    Prelude> :{
    Prelude| let myunpack (x:xs) = unpackagain x
    Prelude|                        where
    Prelude|                          unpackagain (y:ys) = y
    Prelude| :}
    Prelude> myunpack [[123]]
    123
    

    【讨论】:

    • 绝对积极
    • 无论输入是什么,它都无法生成除数字列表之外的任何内容
    • 我刚刚又做了一次,我的错误消息是 - - * 无法将预期类型 '[[int]]' 与实际类型 int 匹配 - * 在 map' , namely 的第二个参数中j' - 在表达式中:map divhs j - 在diver 的等式中:
    • @BenjBarrett 那么您的输入变量 j 显然不是整数,而是一个 int 列表列表
    • 一旦我删除了对该功能的任何尝试,一切都运行良好:[
    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多