1

タプルのリストがあります:

myList = [(1,1000), (2,2000), (3,3000),(4,4000]

そして、このリストを処理して、各タプルの最初の要素が同じままで、2番目の要素が累積されるようにします。したがって、上記のmyListの場合、次のようになります。

[(1,1000),(2,3000),(3,6000),(4,10000)]

を使用する関数を作成しようとしましたscanl1が、コンパイルされません。

myFunction myList = scanl1 f l
           where f = (\acc (x,y) -> (x, acc + y))

どんな助けでも、大いに感謝します

4

1 に答える 1

5

まず、質問にタイプミスがありmyListます。lmyFunction myList = scanl1 f l


主な問題は、 の最初の引数scanl1が typea -> a -> aである必要があることですが、スキャン関数fには typeがあり、とNum c => c -> (b, c) -> (b,c)の両方がある場合に型を統一する方法がありません(つまり、「無限型を構築できません」というエラー)。a = ca = (b,c)c = (b,c)

これを解決する方法は、 がリスト内の前の結果と次の項目 (この場合は両方の形式) にscanl1 f適用されることを覚えておくことです。これは与える:f(x,y)

myFunction myList = scanl1 f myList
       where f (_,acc) (x,y) = (x, acc + y)

(注: アンダースコアは未使用のパラメータを示します。)

于 2012-11-12T20:40:40.153 に答える