【问题标题】:Converting [Integer] -> Integer转换 [整数] -> 整数
【发布时间】:2014-11-01 22:03:31
【问题描述】:

我以前从未编程过,最近(1 周前)才开始学习!第一门课程是函数式编程,使用 Haskell。

我有一个学校作业,我想通过删除一两个步骤来改进,但我遇到了一个讨厌的错误。

基本上,我创建了一个列表,我得到了[Integer] 类型的结果,而我想将其转换为Integer,如果可能的话?我已经将我的测试函数设置为接受 Integer -> Integer -> Bool 类型(接受两个值,计算它们,然后返回一个布尔值)。测试函数将值放入两个函数并比较它们的结果。

我可以将预期类型更改为 [Integer] (?) 但这将消除手动输入值的选项。

对于我的测试用例,我选择了一些值并将它们放入列表中。 a = [0, 2, (-3)]b = [0, 2, 4]。当我调用该函数时,我想做的是输入ab 作为值,而不是每次都输入每个测试用例。这可能吗?示例:

testFunction a b

而不是类似的东西

testFunction Integer Integer.

我希望我说得通 :-) 请记住,我只是在学习!

【问题讨论】:

  • 您想要做什么并不完全清楚。您似乎想从两个列表中提取测试值以传递给测试函数。你想执行来自ab 的所有元素组合,还是只执行testFunction 0 0testFunction 2 2testFunction (-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 条建议中,您可能会找到对您有帮助的东西。

标签: list haskell integer


【解决方案1】:

不要让这对您来说太复杂,您似乎正在寻找的是能够将两个整数列表传递给一个接受整数的函数,以执行逐元素操作。

为此,您可以使用zipWith,其类型签名为:

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]

此类型签名意味着 zipWith 采用一个函数,该函数接受两个单独的元素和两个列表,并返回一个基于您传递的函数结果构建的列表。

总之,你会执行:

zipWith myFunction [1,2,3,4] [5,6,7,8]

现在,您要创建一个函数,首先在两个函数上使用zipWith,然后再次使用zipWith 比较两个结果列表,最终返回布尔值。如果您想更复杂,可以在末尾使用 and 函数,如果所有布尔值都是 True,则返回一个布尔值。

现在,构建该函数作为练习留给读者 :)

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2022-07-15
    • 1970-01-01
    • 2011-10-05
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2018-06-26
    相关资源
    最近更新 更多