2011-01-19 1 views
0

関数はリストの実行合計を返す必要があります。 [1,2,3,5]で呼び出すと[1,3,6,11]が返されます。私はGHCiの中でそれを実行すると、それは私を示しハスケルのscanl1について

sumlist' :: [xx]=[xx] 
sumlist' []=[] 
sumlist' [x]=x 
sumlist' xx=scanl1 (+) [xx] 

私は複数の宣言を行うこと:

は、私はこの機能を以下のように書きました。では、この関数の何が問題になっていますか?

+0

ハスケルコードをより読みやすくするために、コードサンプルタグを使用してください。 –

+0

@Zach L:ポスター[それを行いました](http://stackoverflow.com/revisions/2c4cc0fb-9ac7-4112-b119-3911f779f113/view-ソース)が、コードサンプルの前後に改行がなかったので動作しませんでした。今修正されました。 –

+1

必要なのは最後の行だけです。他の2つは冗長です(実際は2番目はタイプエラーです)。 – sepp2k

答えて

4

まず第一に、あなたはsumlistは、「タイプXXのリストを取り、タイプXXのリストを返しますので、

sumlist' :: [xx]->[xx] 

のようなものに宣言を変更したいです。

scanl1の呼び出しで(+)を使用していて、(+)タイプがNumであるため、sumlist 'の定義に戻って、具体的にリストを取得する必要があります数の

sumlist' :: Num xx=>[xx]->[xx] 

scanl1はあなたよ、あなたはまだ、ただキックのために、あなたのコードを試してみたいのであれば、あなたが必要とするすべては、しかし

sumlist' :: Num xx=>[xx]->[xx] 
sumlist' xx = scanl1 (+) xx 


で、空のリストを扱うことができます最後の2行を修正する必要があります。

xが要素を含む場合、

sumlist' [x] = x 

覚えておいてください、sumlistは、」リストを受け取り、はリストを返すので、戻ったばかりのリストを返します!

sumlist' [x] = [x] 

そして、あなたはXXと呼ばれるリストを取る最後の場合、用

、あなたはとても、GHCは [xx]がリストの リストだと思いますので、

sumlist' xx=scanl1 (+) [xx] 

xxは、すでにリストされてい

:だから、私たちの改訂コードのようなものがあるだけでカッコ

sumlist' xx=scanl1 (+) xx 

を削除

ephemientとして、GHCiに複数の行を入力する必要がある場合は、:loadコマンドを使用します。

+0

こんにちは、この説明は非常にはっきりと感謝しています!! – CathyLu

+0

Nitpicking:あなたは ':{'と ':} 'を使うこともできます。 GHC 7.0以降、レイアウトをサポートしています。 – fuz

0
sumlist' :: [xx]=[xx] 

その行が間違っています。 ::の後の部分は、型宣言でなければなりません。型宣言は[a] -> [a]のようになります。 (はい、それはのようなパターン/値[xx]に見えますが、ではありません。)

GHCiのに複数行の宣言を入力しないでください、それは別に、各入力行を扱います。それをファイルに保存して、GHCiのファイル:loadを保存してください。

0

これは、あなたの質問に直接答えではなく、より高次の機能を使用してsumListを定義するためのより良い方法は以下のようになり:-)・ホープ、このことができますし、幸せなハッキング:

sumList :: (Num a) => [a] -> [a] 
sumList = tail . scanl (+) 0 

あなたの型シグネチャが、->の明白な間違い=にもかかわらず、あなたの関数が "Numクラスの何らかの型"のリストでのみ機能し、 "どの型のリスト"でも機能しないという点で、 "あまりにも多態的"でした。