2011-07-14 7 views
8

私はHaskellでは初心者だし、私は疑問を持っている: 私が書くコード:ハスケルと文字列の長さ

word_list = ["list", "lol", "wordword"] 
check str = if head str == 'l' then tail str else str 
average wl = (length $ concat $ map check wl) `div` length wl 

単語リスト内の各単語の最初の「L」の記号を削除する必要があり、このコード、連結が受け取った単語結果の文字列の長さを取得し、単語数をdivにする。

ので、このコードでは、私が受け取る必要があります。 3分の13 = 4333を...( "listlolwordword" = 15、 "istolwordword" = 13) しかし、私は動作しないだけで4

average :: [[Char]] -> Floatを受け取ります、私はエラーを受け取る。どこで私の間違い? ps。すみません、英語です

答えて

12

length関数はIntを返し、div関数は整数除算を実行します。つまり、小数部を削除します。私はそれをしていながら

word_list = ["list", "lol", "wordword"] 
check str = if head str == 'l' then tail str else str 
average wl = fromIntegral (length $ concat $ map check wl)/fromIntegral (length wl) 

、あなたの代わりにcheckでパターンマッチングを使用して検討する必要があります。あなたはFloat結果をしたい場合は、まず、Floatlengthの結果を変換する代わりに、除算のため(/)を使用する必要があります例えば:

check ('l':str) = str 
check str = str 

このスタイルは、より読みやすく、ミスを持っている可能性が低いの両方で - 空の文字列を指定した場合など、ご使用のバージョンは失敗します。

+0

wow。どうもありがとうございます! パターンマッチングについて:素晴らしい!私はもっ​​と毎日hasskelが好きです:) –

+1

@user:concatMapもありますので、 'concat $ map'を実行する必要はありません。 –

+1

と私は、より明確なアプローチはおそらく 'sum $ map(length。check)wl'です(しかし、融合はこれを重要でないものにします) – alternative