2017-05-24 17 views
0

私はデータ型がPersonであるとします。データ型母親から母親(祖母)

data Person = Person String Person 

2.人は母親でなければなりません。

showGrandmother :: Person -> Maybe Person 
showGrandmother (Person _ mother) = Just mother 

人物xの母親のみを表示します。 祖母を見せてもらえますか?

答えて

4

最初に、データ定義に基本ケースがありません。これはmatrilinealityを表し仮定すると、私は今、祖母がパターンマッチングではこの二回

grandmother = \x -> mother x >>= mother 
+0

正に、私はそのコードを理解していません。 私の機能(showGrandmother)を変更する必要がありますか? –

+1

@ R.Mayer「私はそのコードを理解できません」を回答できる質問に変換してください。 (あなたが理解するのが難しいのはどこですか?コードを読んでいないところはどこですか?)「私の機能を変更するにはどうすればよいですか」というのは、ちょうどその答えが、答えはここに書かれています。 –

+0

'showGrandmother = grandmother' – karakfa

2

を適用しているmother機能

mother Eve = Nothing 
mother (Person _ m) = Just m 

を定義Eve

基本ケースとして
data Person = Eve | Person String Person deriving (Show) 

を開始すると、あなたが上がりませんあるレベルのコンストラクタに限定されていれば、それらをさらに "in"にネストすることができます:

追記として
showGrandmother :: Person -> Maybe Person 
showGrandmother (Person _ (Person _ grandmother)) = Just grandmother 

、私はHaskellの専門家ではないんだけど、データ型は家系図のモデルであることを意味している何のために少し円形であるように思えます。他の人を参照することなく実際に人を作成することはできません。たぶん、より良い何かが、祖母を見つけるときのベースケースを扱うことを確認して...

showGrandmother :: Person -> Maybe Person 
showGrandmother (Person _ Just (Person _ (Just grandmother)))) = Just grandmother 
showGrandmother _            = Nothing 

...として行うことができ、その場合には...

data Person = Person String (Maybe Person) 

...だろう誰かに祖母はいません。元のタイプは、誰もがそれに応じて祖母を持っている必要があるので、このケースを処理する必要はありませんでした。


そして@Karafka's answerからインスピレーションを取って、それは人の母を見つけて考慮することが可能です...

showMother :: Person -> Maybe Person 
showMother (Person _ (Just mother)) = Just mother 
showMother _      = Nothing 

...とMaybeがモナドであるという事実を使用して、使用することができますそれは以下の通りです。

showGrandmother :: Person -> Maybe Person 
showGrandmother x = showMother x >>= showMother 

私は、上記のモナドコードがこの特定の質問の対象外であると理解していると思われます。

関連する問題