2016-04-11 15 views
1

私はちょうどHaskellの学習を始め、偶数長のリストと奇数長のリストの2つの関数を書いています。これは[0..7]の[even]関数が[0,7,2,5,4,3,6,1]を返し、[0..8]の 'odd'関数が[0、 7,2,5,4,3,6,1,8] - これは私が必要とする結果です。 しかし、私はまだ多くの作業の後に、私はそれらを組み合わせることができないので、ただ一つの関数が両方のリストに対して機能するようになっています。ここに関数があり、より経験豊かなHaskellのコーダーが解決策を知っているかどうか疑問に思いました。Haskell関数の開始時に定数を定義する

funcOdd :: [Int] -> [Int] 
funcOdd [] = [] 
funcOdd (x:xs) = take (n+1) ((x*2) : (pred n - x):funcOdd(xs)) where n = length xs 

funcEven :: [Int] -> [Int] 
funcEven [] = [] 
funcEven (x:xs) = take (n+1) ((x*2) : (n - x):funcEven(xs)) where n = length xs 
+0

この機能の意図された意味および/または目的を説明できると便利です。これは何か数学的かもしれないようなにおいがする。根底にある意味を考えれば、コードを見つめるよりも簡単でクリーンなソリューションにつながる可能性があります。 – dfeuer

答えて

1

あなたはパターンマッチを例

fullFunction theList | even (length theList) = funcEven theList 
fullFunction theList = funcOdd theList 

あなたがfullFunctionを呼び出す

を分離することができ、それは、リストの長さが偶数であるかどうかをチェックする、最初のケースをしようとします。これが失敗すると、それは第2の場合にフォールバックする。

+0

ありがとう、私はパターンマッチングを関数に使うことはできませんでした。 –

1

おそらくクリーナーこのよう

func xs = zipWith const (go xs) xs 
    where go [] = [] 
      go (x:xs) = 2*x : ((length xs)-off-x) : go xs 
      off = mod (length xs) 2 

Iは2つの機能の間に見る唯一の違いは、元のリストの長さに由来するオフ(セット)に置き換えられn VS pred nの使用です。

zipWith const ...元のリストの長さで結果を切り捨て、置き換えられるのはtake (n+1)です。

+0

ありがとう、karakfa。私は 'zipWith const ... 'を関数の導出に使用しましたが、それがどのように動作するかは分かりません。 'zipWith'はgo関数との関係でどのように機能しますか? '(go xs)xs'はリストとして機能しますか? –

+0

'(go xs)'を 'xs'で圧縮し、最初の要素を選びます。これはリストの長さを2つの最小長(この場合は 'xs'の長さ)に制限するためです。 fyi: 'const a b = a'。ここでは、長さがすでに計算されているので、 'take x'を使うことができると思います。 – karakfa

関連する問題