【发布时间】:2014-11-01 22:03:31
【问题描述】:
我以前从未编程过,最近(1 周前)才开始学习!第一门课程是函数式编程,使用 Haskell。
我有一个学校作业,我想通过删除一两个步骤来改进,但我遇到了一个讨厌的错误。
基本上,我创建了一个列表,我得到了[Integer] 类型的结果,而我想将其转换为Integer,如果可能的话?我已经将我的测试函数设置为接受 Integer -> Integer -> Bool 类型(接受两个值,计算它们,然后返回一个布尔值)。测试函数将值放入两个函数并比较它们的结果。
我可以将预期类型更改为 [Integer] (?) 但这将消除手动输入值的选项。
对于我的测试用例,我选择了一些值并将它们放入列表中。 a = [0, 2, (-3)] 和 b = [0, 2, 4]。当我调用该函数时,我想做的是输入a 和b 作为值,而不是每次都输入每个测试用例。这可能吗?示例:
testFunction a b
而不是类似的东西
testFunction Integer Integer.
我希望我说得通 :-) 请记住,我只是在学习!
【问题讨论】:
-
您想要做什么并不完全清楚。您似乎想从两个列表中提取测试值以传递给测试函数。你想执行来自
a和b的所有元素组合,还是只执行testFunction 0 0、testFunction 2 2、testFunction (-3) 4等值对? -
这听起来像是你想要一个函数
testFunction :: [Integer] -> [Integer] -> [Bool],它在每一步都获取每个列表的第一个元素,运行你的函数testFunction,然后将它附加到先前计算的版本列表中.看看你能不能想出用 Haskell 表达的方法。 -
您可以使用库吗? QuickCheck 将有助于测试。
-
跟进@C.Quilley 的建议,你怎么能用递归来做到这一点?我会让你开始:
testAll :: [Integer] -> [Integer] -> [Bool];testAll (x:xs) (y:ys) = <something with "testAll xs ys">;testAll _ _ = [],最后一个 case 捕获其中一个或两个输入列表为空的情况。 -
另一个提示:尝试在hoogle 中输入您想要的类型签名,然后看看会发生什么。我敢打赌,在返回的前 10 条建议中,您可能会找到对您有帮助的东西。