2016-04-12 3 views
0

私はまだHaskellとFunctional Programmingの仕組みを理解しようとしています。私の機能がうまくいかない理由を理解するのに役立つ必要があります。私は、整数のリストをパラメータとして取り、最初のリストから3の倍数を含むサブリストをフィルタリング/返す関数を作成しようとしています。ここに私のコードは次のとおりです。Haskell Filterリストからサブリストへの3の倍数

module Main where 

sublist = [] 

myFunc :: [Int] -> [Int] 

myFunc [] = [] 

myFunc [t] = do 
    if t `mod` 3 == 0 
     then t : sublist 
    else myFunc [] 

myFunc (h:t) = do 
    if h `mod` 3 /= 0 
     then myFunc t 
     else do 
      h : sublist 
      myFunc t 

これは[] =のみの関数に渡された最後の値を含むリストを返し、まだサブリスト。あなたが私に事前に与えることができる任意のアドバイスありがとう。

+0

あなたのコードは、不変性の原則を理解していないようです。ステートメント 't:sublist'はサブリストを全く変更しません。単に' t'を含むリストを生成します(サブリストは常に空であるため、不変性が働く - バインディングは変わりません)。 –

+0

ここには 'do'は必要ありません。モナドについて学ぶまでは 'do'を使わないでください。 (おそらく、あなたはモナドを使う前に 'IO'で' do'表記を使うことで逃げることができます。) – PyRulez

+0

このコードがなぜコンパイルされるのかを解説し、コンパイルしたらなぜそれが動作するのか中間レベルのHaskellプログラマーのための素敵なエクササイズです。 = D –

答えて

2

まず、精神的に機能的なスタイルに切り替える必要があると思います。例えば

が、これはあなたが

filter' :: (a -> Bool) -> [a] -> [a] 
filter' _ [] = [] 
filter' condition (x:xs) = if condition x 
           then x : filter' condition xs 
           else  filter' condition xs 

divisibleBy3 n = mod n 3 == 0 

今、あなたのプログラムが

のように書くことができ、同じ機能を実装することができ、既存の機能を使用せずにリスト

> filter even [1..10] 
[2,4,6,8,10] 

から偶数を取得することです

filter' divisibleBy3 inputList 
+0

ありがとうございます、このコードは非常に役に立ちました。機能的なスタイルへの精神的な切り替えを手助けするために、あなたや他の誰かが推薦できるリソースはありますか?私はPrologでも再帰関数を把握しようとしましたが、C++のような言語で簡単に問題を解決するには十分理解できません。 –

+0

もしあなたが新鮮なものを始めるなら、おそらく本はもっと便利です。ハスケルで機能的にBird's Thinkingをお勧めしますが、他にもたくさんのオプションがあります。おそらく、無料のオプションLYAHですが、私はそれを読まなかったのです。 – karakfa

関連する問題