如何用变量haskell划分列表

时间:2018-01-08 12:16:47

标签: list haskell division

做一个小项目,但经过几个小时的工作,我仍然无法解决如何用变量划分列表中的每个元素

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

不会工作,也不会

 map (/ j) hs

任何人都非常欢迎任何帮助

真的,你的 haskell scrub

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

您对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]

根据您的评论和错误消息

 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