2014-03-28 43 views
0

我試圖通過從矩陣中逐一切分第一列來查找矩陣的轉置。看起來像我匹配模式「數組包含單個數組包含單個元素」。不知道這是否會導致錯誤。幫助我找出我錯在哪裏。函數中的非窮盡模式 - 查找下界

module Main(main) where 

    import System.IO 

    firstCol [[]] = [] 
    firstCol ((x:xy):xs) = [x] ++ firstCol xs 
    --firstCol [x:[]] = [x] -- not working 
    firstCol [x:xy] = [x] 
    --firstCol [x] = [x] 

    restCols [x:xy] = [xy] 
    restCols ((x:xy):xs) = [xy] ++ restCols xs 

    zipz [[]] = [[]] 
    zipz (xs) = [firstCol xs] ++ (zipz $ restCols xs) 

    main = do 
      print $ zipz [[1,2,3],[2,4,5],[5,6,7]] 
+1

情況'firstCol []','restCols []'和'zipz []''怎麼辦? 'firstCol'只處理一個包含空列表的列表,至少包含一個包含至少一個元素的元素的列表,以及包含至少一個元素的一個元素的列表(因爲它出現在'( (x:xy):xs)'case)。 restCols只能處理一個包含至少一個元素的元素列表和一個包含至少一個至少包含一個元素的列表的列表。 'zipz'靠近一個包含空列表的列表模式,然後在其他列表中搜索。順便說一下:'Data.List.transpose'。 – bheklilr

回答

1

裝載firstColghci,我們看到

λ. :t firstCol 
firstCol :: [[a]] -> [a] 

但在這種情況下

firstCol [x:[]] = [x] 

在模式[x:[]]x的類型爲[a],然後[x]在RHS的類型爲[[a]] 。但firstCol必須返回[a],因此類型錯誤。