用我自己的类型签名构造一个函数 - 避免重复代码

时间:2016-05-07 22:43:48

标签: haskell types

我已经定义了一种数据类型:

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

..像这样......

3 个答案:

答案 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...