2016-10-10 10 views
3

ラムダ関数の応用ファンクタをテストしていますが、私が書いた以下のコードが残っています。 「myAddition」「はランダムA」の累計を取る必要があります。ラムダ式内の適用ファンクタ、非網羅的なパターン?

私は、これは、関連する

data Random a = Nill | Random a deriving (Show, Ord, Eq) 

randomOrNot = [Nill, Random 22, Random 101, Nill, Random 44] 

instance Functor Random where 
    fmap f (Nill) = Nill 
    fmap f (Random a) = Random (f a) 

instance Applicative Random where 
    pure a = Random a 
    (<*>) (Random a) = fmap a 

cumulativeTotal :: [Random a] -> Random a 
cumulativeTotal li = foldr (\el acc -> (pure (+) <*> el) <*> acc) (Random 0) li 

main = do 
    print $ cumulativeTotal randomOrNot 

あるので、しかし、私はファンクタを学んでいる、以下を行うには良い方法があるに感謝しますエラー:

エラーが何を意味するのか理解していますが、アプリケーションファンクタのラムダを網羅的にする方法がわかりません。

instance Applicative Random where 
    pure a = Random a 
    (Random f) <*> (Random a) = Random (f a) 
    _ <*> _ = Nill 

まず、フォーマットf (a -> b) <*> f a)に持ち込むとRandom (f a)として最初のケースのために結果を定義します。

+1

それが何をすべき? –

+1

あなたは 'Applicative Random'インスタンスの'(<*>)Nill'を処理していません。 –

+0

あなたの 'ランダム'タイプは、おそらく偽装しているかもしれません。 – chepner

答えて

3

は、ここでは、この問題を解決することができます一つの方法です。次に、f (a -> b)f aの用語にかかわらず、結果をNillに設定して入力がNillのケースを処理します。これにより、Randomコンストラクタのすべての可能な値に対処し、非網羅的なパターンの問題を解決します。

また、あなたは同じ結果で、ダウン、さらにそのようなケースを壊すすることもできます:あなたはNillにそれを適用した場合

instance Applicative Random where 
    pure a = Random a 
    (Random f) <*> (Random a) = Random (f a) 
    _ <*> Nill = Nill 
    Nill <*> (Random a) = Nill 

Demo

+0

Nill値をスキップ/無視したい場合はどうすればよいですか?それ以外の場合、上記のソリューションでは、Nill値のインスタンスは累積出力がNillになります。 –

+0

それで、あなたの予想される出力は、与えられた入力のように見えますか? –

+0

[Nill、Random 2、Random 4] = Random 6(あなたの解決法はNillです) –

関連する問題