做一个小项目,但经过几个小时的工作,我仍然无法解决如何用变量划分列表中的每个元素
diver xs = map divhs j
where divhs = div hs
hs = tupleTest1 xs
j = jot xs
不会工作,也不会
map (/ j) hs
任何人都非常欢迎任何帮助
真的,你的 haskell scrub答案 0 :(得分:1)
where divhs = div hs
hs = tupleTest1 xs
j = jot xs
这不是正确的缩进。每行的第一个非空格字符(在where
之后)是重要的。由于每一行的开始时间比前一行更多,因此整个where
块的解析就好像它在一行上一样。
where divhs = div hs hs = tupleTest1 xs j = jot xs
因此,出现错误,特别是因为hs
和j
被解析为附加参数,并且该行上有太多=
个符号。
答案 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