簡體   English   中英

Haskell添加到列表中的列表

[英]Haskell add to list in list

我有以下代碼


groupEq :: Eq a => [a] -> [[a]]
groupEq list = foldl (\acc x -> if (isType acc x) then ((last acc) ++ [x]) else acc++[[x]]) [] list

isType :: Eq a => [[a]] -> a -> Bool
isType list item 
    | (length list) == 0 = False
    | head (last list) == item = True
    | otherwise = False

現在,我很難理解為什么無法編譯。 問題在於它的((last acc) ++ [x])部分。 我理解它是因為它需要累加器的最后一個元素,這時將是[[a]]並嘗試向其中添加一個元素。

我想要實現的想法是: -- groupEq [1,2,2,3,3,3,4,1,1] ==> [[1], [2,2], [3,3,3], [4], [1,1]]

完全錯誤是


Couldn't match type ‘a’ with ‘[a]’
      ‘a’ is a rigid type variable bound by
          the type signature for groupEq :: Eq a => [a] -> [[a]]
          at exam_revisited.hs:3:12
    Expected type: [[[a]]]
      Actual type: [[a]]
    Relevant bindings include
      x :: a (bound at exam_revisited.hs:4:28)
      acc :: [[a]] (bound at exam_revisited.hs:4:24)
      list :: [a] (bound at exam_revisited.hs:4:9)
      groupEq :: [a] -> [[a]] (bound at exam_revisited.hs:4:1)
    In the first argument of ‘last’, namely ‘acc’
    In the first argument of ‘(++)’, namely ‘(last acc)’

我在這里想念什么?

groupEq被聲明為返回[[a]] ,但是((last acc) ++ [x])的類型為[a] 一個快速而骯臟的解決方案是將這個表達式更改為init acc ++ [last acc ++ [x]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM