想知道我是否可以在编写此功能方面获得帮助。我正在尝试创建一个函数,以反转列表中的每个“对”。

module Invert where
invert :: [(a,b)] -> [(b,a)]
invert [(a,b)] = [(b,a)]

当我输入invert [(3,1) (4,1) (5,1)] ...应该给我[(1,3) (1,4) (1,5) ...但是它给了我...
*Invert> [(3,1) (4,1) (5,1)]

<interactive>:2:2:
    The function `(3, 1)' is applied to two arguments,
    but its type `(t0, t1)' has none
    In the expression: (3, 1) (4, 1) (5, 1)
    In the expression: [(3, 1) (4, 1) (5, 1)]
    In an equation for `it': it = [(3, 1) (4, 1) (5, 1)]

最佳答案

由于列表是递归数据结构,因此必须递归处理列表以交换其所有元素,或使用一些更高阶的函数来为您处理。如果您定义

invert [(a,b)] = [(b,a)]

它将仅转换单元素列表,所有其他输入将失败并显示错误!

尝试考虑输入invert得到:它是一个空列表,或者是一个非空列表。对于非空列表,可以交换第一个元素,然后递归转换其余元素。

(如果您不想自己反转invert,只需使用
invert = map swap

其中 swap 来自Data.Tuple。)

关于haskell - Haskell反相对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14817119/

10-15 19:18