2016-09-30 6 views
2

私は一見シンプルなHaskellの問題を抱えています。私の限られた知識では、それを解決するためにどのような用語を検索するのか不明です。haskell初期アキュムレータ 'null'値

私は99のHaskellの問題(リストから連続した重複を削除)から、問題番号8を解決しようとした、これは私が作ってみたものです:

compress :: (Eq a) => [a] -> [a] 
compress list = compress' list ??? 
    where 
    compress' [] _ = [] 
    compress' (x:xs) last 
     | x == last = compress xs last 
     | otherwise = x : compress xs x 

「???」これは私が何をすべきかわからない場所です。スニペットがどのように動作することが意図されているのかはっきりしていなければならないと思います。 'last'は要素が以前のものと重複しているかどうかをチェックするためのアキュムレータです。 ここでは、どのような初期値を与えることができますか? (私が思うほとんどのオブジェクト指向言語では 'ヌル'に類似しています)。

編集:Tikhonの答えが働いていますが、私は自分のオリジナルの投稿に間違いをしたことに気付きました。したがって、私の問題に対する「些細な」解決策は、今すぐです:

compress :: (Eq a) => [a] -> [a] 
compress list = compress' list Nothing 
    where 
    compress' [] _ = [] 
    compress' (x:xs) Nothing = x : compress' xs (Just x) 
    compress' (x:xs) (Just last) 
     | x == last = compress' xs (Just last) 
     | otherwise = x : compress' xs (Just x) 
+1

'???ただのプレースホルダです。 '??? 'で' 'を変更してreloadすると、GHCiはどのタイプが"型付きの穴 "にあるべきか推測しようとします。 – danidiaz

+4

'compress [] = []; compress(x:xs)= x:compress 'xs x' – melpomene

答えて

9

質問には2つの回答があります。より多くのリテラルの答えは、あなたがNULL可能なものを作るためにMaybeを使用することができ、かつ型システムは、あなたが何かがNothingであるかどうか、あなたがそれを使用するたびにチェックしてくださいということです。

compress list = compress' list Nothing 
    where compress' [] _ = [] 
     compress' (x:xs) Nothing = x : compress xs (Just x) 
     compress' (x:xs) (Just last) 
      | x == last = compress xs last 
      | otherwise = x : compress xs (Just x) 

話の教訓は、もしあなたのことです他の言語ではnullになる可能性がある要素がある場合は、Maybeにラップします。次に、Just xまたはNothingのいずれかがあり、リストのパターンマッチングと同じ方法でパターンマッチングを行うことができます。

ただし、この特定のケースでは、より洗練されたソリューションを提供することができます。最初にcompress'と呼び出すと、その要素にはが足りないことに注意してください。私たちは、この可能性ハンドルトップレベルcompress機能にケースを追加することによって、これに対処することができます基本的に

compress [] = [] 
compress (x:xs) = x : compress' xs x 
    where ... 

を、我々は代わりにそれを扱う場合には、当社のヘルパーcompress'機能でケースを処理する必要が回避することができますトップレベルの関数で、渡されたリストを照合して何をすべきかを決定できます。

+0

これはおそらくあなたの意図だったと思うので、 'compress'への引数として' x'を追加しました。もしそうでなければ、私の謝罪。 –

+0

@DanielWagner:ありがとう!それはほぼ間違いなく私は(まだ)私のコードをテストするにはあまりにも怠惰だった:)。 –