我已经定义了一种数据类型:
data Citizen = J11 String String | J12 String String
我想编写一个函数:getName:
getName :: Citizen -> String
getName (J11 firstName lastName ) = firstName
getName (J12 firstName lastName ) = firstName
是否可以避免重复代码,具体取决于它是J11还是J12?没有改变类型签名?
getName (XXX firstName lastName ) = firstName
..像这样......
答案 0 :(得分:6)
或者,你总是可以提高一级
data Citizen a = Citizen a String String
firstName :: Citizen a -> String
firstName (Citizen _ f _) = f
> let j1 = Citizen J11 "John" "Doe"
> firstName j1
"John"
答案 1 :(得分:3)
另一种选择是使用记录。
data Citizen =
J11
{ firstName :: String
, lastName :: String
} |
J12
{ firstName :: String
, lastName :: String
}
这会自动为您定义函数firstName, lastName :: Citizen -> String
。
答案 2 :(得分:0)
对于一个简单的右手边,就像你的例子一样,这是不值得的。但是如果你的功能更复杂,你可以做类似的事情:
getName citizen =
case citizen of
J11 first last -> f first
J12 first last -> f first
where
f = ...complex definition...