2016-08-28 5 views
0

私はしかし、いくつかの問題(私は合計初心者です)を有する。..整数のリストからすべての奇数をドロップしようとしています:私を与えるHaskellはしても、ここに私のコードは、数イテレーション

evenfunc :: [Int] -> [Int] 
evenfunc li = 
     x = head li 
     y = tail li 
     if even x 
      then x : myevenfunc xs --take head an pass tail recursively 
     else 
      drop x li : myevenfunc xs --drop head from list and pass tail recursively 

そのこれを実行しようとすると、 '入力時の解析エラー=' 'というメッセージが表示されます。

私はここで間違っていますか?

+2

['let'キーワード](http://learnyouahaskell.com/syntax-in-functions#let-it-be)を使用することを意味しますか? – kennytm

答えて

3

evenfunc list = filter even list 

か、さえ:

evenfunc :: [Int] -> [Int] 
evenfunc [] = [] 
evenfunc (x:xs) = if even x then x : tail else tail where 
    tail = evenfunc xs 
filterは正確に何をしたいん

最初の行evenfunc [] = []がベースケースを処理します。空のリストです。解決策でこれを見逃していましたが、空のリストにheadを呼び出すと、例外が発生します。

2行目は、パターンを使用してリストを分解します。xが先頭で、xsがテールです。次に、命令型の言語と同様に、ifを使用します。値が返されるという違いがあります(実際には、Javaの3進演算子x ? y : zなどに近い)。反復を避けるために、where節にサブ式tailを定義します。定義する前に物事を使用するのが変わった場合は、代わりにletを使うことができます。もちろん、tailを計算することは、再帰呼び出しを実行することを意味します。

+0

非常に役に立ちます..ありがとう –

3

Haskellはあなたが文を注文した命令型言語ではありませんが、letを使用して識別子に値を結合することによって、あなたの方法を達成することができます

f :: Int -> Int 
f x = let y = x + 5 in y * 3 

しかし、たとえこれはあなたの機能を使用すると、いくつかの問題があります。

  • あなたの再帰呼び出しが間違っている(evenfuncを使用)
  • dropの使用状況は、おそらく間違っ
  • です
  • どこでも

すべてのすべてで、それはライブラリ関数を使用して、あなたのアプローチを改造するためにおそらく最高ですxsを定義することはありません。 filterを使用して、指定されたソリューションが好まれるはずですが、再帰的なバージョンは、あまりにも、有益かもしれない。もちろん、

evenfunc = filter even 
+0

ありがとうございます - 私は、リスト上にマップして要素をドロップしたいのですが?どのようにそれを構造化しますか? –

+2

@ronaldmurphyこれはまさに 'filter'の目的です。 – ThreeFx

関連する問題