2016-05-07 13 views
1

の重複を避ける:は自分の型シグネチャを持つ関数を構築する - 私は、データ型定義されているコード

data Citizen = J11 String String | J12 String String 

を、私は機能を書きたい:のgetName:

getName :: Citizen -> String 
getName (J11 firstName lastName ) = firstName 
getName (J12 firstName lastName ) = firstName 

はそれが可能ですそれがJ11かJ12かによってコードが重複しないようにするには?型署名を変更することなく?あなたの例のように、このよう..something

getName (XXX firstName lastName ) = firstName 

...シンプル右側の場合

+0

Nope。それが理にかなっていれば、データ型をCitizenTypeとCitizenに分割することができます。 –

答えて

6

かを、あなたは常に別のオプションは、レコードを使用することで1つの高いレベル

data Citizen a = Citizen a String String                  
firstName :: Citizen a -> String                   
firstName (Citizen _ f _) = f                    

> let j1 = Citizen J11 "John" "Doe"                    
> firstName j1           

"John" 
0

それは価値がありません。あなたの関数は、あなたが何か行うことができ、より複雑であったなら:

getName citizen = 
    case citizen of 
    J11 first last -> f first 
    J12 first last -> f first 
    where 
    f = ...complex definition... 
3

を行くことができます。

data Citizen = 
    J11 
    { firstName :: String 
    , lastName :: String 
    } | 
    J12 
    { firstName :: String 
    , lastName :: String 
    } 

これは、機能firstName, lastName :: Citizen -> Stringを自動的に定義します。

関連する問題