List 分析列表haskell的列表
您好,我有一个函数,给定一个列表,它返回它的一个子集置换。现在我想做另一个函数,给定一个列表,它使用第一个函数生成另一个列表。更清楚地说:List 分析列表haskell的列表,list,haskell,List,Haskell,您好,我有一个函数,给定一个列表,它返回它的一个子集置换。现在我想做另一个函数,给定一个列表,它使用第一个函数生成另一个列表。更清楚地说: 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] ++ d
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
现在我想做一个函数,给出一个列表列表,例如[[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]]列表中的
generate_permutations2'的第一个参数,即
(++)的第二个参数,即
generate_permutations2[list]'
编译器抱怨generate_permutations2无法处理其输入为空列表的情况。为generate_permutions2[]
添加一个子句,就像您在insert
和delete
中所做的那样
社论:
如果将类型注释添加到函数中,您的意图会更加清晰。当您告诉GHC顶级类型时,GHC更能找到问题的根源。另外,其他Haskell程序员经常从类型签名推断您在做什么 他需要将它从[xs:list]
更改为(xs:list)
。前者仅在包含至少一个元素的单个子列表的列表上匹配,后者在包含至少一个子列表的列表上匹配。我添加了这个generate_permutions2[]=[[]],但我从compiler@bheklilr我改变了你说的,现在它甚至不会编译@JmRag你能提供比“不会编译”更多的信息吗?正如贝克利尔所指出的,[x:xs]
(具有类型[[a]])与(x:xs)
(具有类型[a])不同。你是什么意思?
generate_permutations2 [[]] = [[]]
generate_permutations2 (xs:list) = my_permutation xs (length(xs:list)) (xs:list) ++ generate_permutations2 [list]