我必須編寫一個展開列表清單的函數。展開列表清單
例如flatten [] = []
或flatten [1,2,3,4] = [1,2,3,4]
或flatten [[1,2],[3],4,5]] = [1,2,3,4,5]
我遇到的麻煩的是能夠匹配取決於什麼是考慮到扁平化的功能類型。
這是我有:
data A a = B a | C [a] deriving (Show, Eq, Ord)
flatten::(Show a, Eq a, Ord a)=>A a -> A a
flatten (C []) = (C [])
flatten (C (x:xs)) = (C flatten x) ++ (C flatten xs)
flatten (B a) = (C [a])
從我可以告訴的問題是,++
運營商期待於它的兩個參數列表,我想給它A
類型的東西。我添加了A
類型,因此該函數可以獲取單個元素或元素列表。
有誰知道以不同的方式來做這個不同的,或解釋我能做些什麼來解決類型錯誤?
我不知道你想要什麼。也許'flatten :: A [a] - > A a;展平(B xs)= C xs; flatten(C xss)= C(concat xss)'會幫助你嗎?基本上,你不能寫扁平化,以便它需要不同的嵌套列表並且與它們做不同的事情,除非你將它們包裝成新類型並通過構造函數區分這些情況。 – 2012-02-29 22:07:13
函數的類型應該是'[[a]] - > [a]'。這意味着'flatten []'是有效的,並且'flatten [[1,2,3,4]]'是有效的,但是'flatten [1,2,3,4]'不是。 '[1,2,3,4]'不是列表的列表。如果你仔細想想並從頭開始,擺脫你的特殊類型,你會發現它更容易。 – 2012-02-29 22:10:42
[列表中的操作| |列表中的操作可能重複如何](http://stackoverflow.com/questions/9477806/operation-on-list-of-lists-how) – rampion 2012-03-01 02:23:32