2017-09-02 11 views
4

私はハスケルにとってとても新しいので、私は数日前に私が持っているコースでハスケルを学び始めました。このコースには、私が現時点で抱えている課題や宿題があります。これは宿題なので、私の問題のヒントや解説は完全ではっきりとした答えよりも高く評価されます。そのようなものとして、私は別の仕事に賞賛したくありません。Haskell - さまざまな種類のリストをシャッフルしますか?

割り当ては、シャッフル関数(skyffla)を書き込むことです。実際のシャッフルは私が理解を助ける必要があるのではなく、アルゴリズムが渡すべきテストの1つです。あまり重要でないことを示すために、シャッフルセクションにアルゴリズムをカッコでマークします。

全ての奇数のインデックスが採取されるまで、ように最初の要素、第三の要素、第5要素とをとり、その後、リストにそれらを追加することによって(skyfflaシャッフル。

第一の残りの要素その後、同じ方法で処理され、最初に処理されたリストに追加され、最後に1つの要素が残されて最後にリストに追加されるまで続きます。

入力例:

skyffla [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 

それは私を与える:

1: _[1, 3, 5, 7, 9, 11] ++ skyffla ([2, 4, 6, 8, 10, 12])_ 
2: _[1, 3, 5, 7, 9, 11] ++ [2, 6, 10] ++ skyffla ([4, 8, 12])_ 
3: _[1, 3, 5, 7, 9, 11, 2, 6, 10] ++ [4, 12] ++ skyffla([8])_ 
(4): _[1, 3, 5, 7, 9, 11, 2, 6, 10, 4, 12, 8]_ 

これは私のコードはまったく同じもので、実際のシャッフルは、それが意図されて同じように働いています。 。[3.4, 2.3, 5, 185, 23]をして返す:_[3.4, 5, 23, 2.3, 185]_をしかし、だから私が述べた、私は私の現在の実装に渡すことはできません一つの試験がある)

として、試験の一つはskyfflaがとるべきです。私が持っているコードで

、私が取得:_[3.4, 5.0, 23.0, 2.3, 185.0]_

これは、がたに追加される「0.0" 以外185、と正しいです。

これはなぜですか?

代わりに "5.0"が代わりに "5"と表示されるようにするにはどうすればよいですか?次のように

私のコードが見えます:

skyffla :: [a] -> [a] 
skyffla [] = [] 
skyffla xs 
    | length xs == 1 = xs 
    | otherwise = dropUnevenElements xs ++ skyffla newList where 
    newList = takeUnevenElements xs 

dropUnevenElements :: [a] -> [a] 
dropUnevenElements [] = [] 
dropUnevenElements (x:y:xs) = x:dropUnevenElements xs 
dropUnevenElements x = x 


takeUnevenElements :: [a] -> [a] 
takeUnevenElements [] = [] 
takeUnevenElements (x:y:xs) = y:takeUnevenElements xs 
takeUnevenElements x = [] 
+0

'dropUnevenElements x = x'? –

+0

リストには1つのタイプの要素しか含めることができません。 –

+0

'skyffla'は 'シャッフル'の奇妙な表音訳ですか?それは本当に「blanda」のようなものでなければなりません。 – SwiftsNamesake

答えて

0

あなたがDecimalタイプを使用してしたいように聞こえます。

λ> import Data.Decimal 

λ> [3.4, 5, 23, 2.3, 185] :: [Decimal] 
[3.4,5,23,2.3,185] 
+2

後続の '.0'を取り除くためだけに別の依存関係を追加しますか? – SwiftsNamesake

+0

浮動小数点数は、依存関係の追加を避けるために適切でない場所を使用するのとは対照的です。ちょっと –

+1

あなたは他の方法で数字をフォーマットすることができます。そして、これは厳格な制約を伴う宿題問題なので、それは許されないかもしれません。 – SwiftsNamesake

4

答えはコードが正しいことです。 Haskellではすべてのリストを取得し、外出先から均質であるため、リストには、あなたの関数に到達するまでに

は、すべての要素がすでに同じタイプ

ghci> [3.4, 2.3, 5, 185, 23] 
[3.4,2.3,5.0,185.0,23.0] 

です。(5fromInteger 5と解釈され、そのコンテキストで必要な型にキャストされます)

出力を文字列として比較すると、この問題が発生します。数字のリストとしてそれらをテストしているなら、それは問題ではありません。

ghci> skyffla [3.4, 2.3, 5, 185, 23] == [3.4, 5, 23, 2.3, 185] 
True 

あなたが本当に直面していることは表示の問題です。 Chris Martin氏は、1つのアプローチであるData.Decimalを提案しています。私の見解では、問題はなく、コードは正しいので、テストケースを変更する必要があります。

関連する問題