【问题标题】:Parsing list of list haskell解析列表haskell的列表
【发布时间】:2014-03-21 20:50:43
【问题描述】:

您好,我有一个函数,它给定一个列表,它返回它的排列子集。现在我想创建另一个给定列表列表的函数,它使用第一个函数生成另一个列表列表。为了更清楚:

delete x [] = []
delete x (y:xs) = if (x==y) then (delete x xs)
                        else (y:delete x xs)

insert x n [] = []
insert x n xs = take (length xs - n) xs ++ [x] ++ drop (length xs - n) xs

insert_and_delete  x n xs= [insert x n (delete x xs)]

my_permutation x 0 list = insert_and_delete x 0 list
my_permutation x n list = insert_and_delete x n list   ++  my_permutation x (n-1) list

    --n is lenght of list
my_permuation 5 4 [5,1,1,1]
[[5,1,1,1],[5,1,1,1],[1,5,1,1],[1,1,5,1],[1,1,1,5]]
my_permutation 3 3 [3,1,1]
[[3,1,1],[1,3,1],[1,1,3]]

现在我想创建一个函数,给出一个列表列表,例如[[5,1,1,1] , [3,1,1]],它将返回一个包含上面所有结果的列表:

[[5,1,1,1],[5,1,1,1],[1,5,1,1],[1,1,5,1],[1,1,1,5],[3,1,1],[1,3,1],[1,1,3]]

到目前为止我的尝试:

generate_permutations2 [xs:list] = my_permutation  xs (length(xs:list)) (xs:list) ++ generate_permutations2 [list]

但是当我尝试调用它时,我得到:

generate_permutations2[ [2,1,1], [3,1]]
Exception: Non-exhaustive patterns in function generate_permutations2

如果更改参数并添加基本情况,请编辑:

generate_permutations2 [[]] = [[]]
generate_permutations2 (xs:list) = my_permutation  xs (length(xs:list)) (xs:list) ++ generate_permutations2 [list]

发生检查:无法构造无限类型:t0 = [t0] 预期 类型:[t0] 实际类型:[[t0]] 表达式中:list 中 generate_permutations2', namely[list]' 的第一个参数 (++)', namelygenerate_permutations2 [list]'的第二个参数

【问题讨论】:

    标签: list haskell


    【解决方案1】:

    编译器抱怨 generate_permutations2 没有处理它的输入是空列表的情况。为generate_permutations2 [] 添加一个子句,就像对insert 和delete 所做的那样。

    社论:

    如果您在函数中添加类型注释,您的意图会更加清晰。当您告诉 GHC 顶级类型时,它更善于找到问题的根源。另外,其他 Haskell 程序员经常习惯于从类型签名推断你在做什么。

    【讨论】:

    • 他需要将其从[xs:list] 更改为(xs:list)。前者仅匹配包含单个子列表且至少包含一个元素的列表,后者匹配包含至少一个子列表的列表。
    • 我添加了这个 generate_permutations2 [] = [[]] 但我从编译器得到了同样的信息
    • @bheklilr 我改变了你所说的,现在它甚至无法编译!
    • @JmRag 你能提供比“不会编译”更多的信息吗?
    • 正如 bheklilr 指出的,[x:xs](类型为 [[a]])与 (x:xs)(类型为 [a])不同。你的意思是什么?
    猜你喜欢
    • 1970-01-01
    • 2015-01-10
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多