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

J.d*_*doe 1 haskell types

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

data Citizen = J11 String String | J12 String String
Run Code Online (Sandbox Code Playgroud)

我想写一个函数:getName:

getName :: Citizen -> String
getName  (J11 firstName lastName  ) =  firstName
getName  (J12 firstName lastName  ) =  firstName
Run Code Online (Sandbox Code Playgroud)

是否可以避免重复代码,具体取决于它是J11还是J12?没有改变类型签名?

getName  (XXX firstName lastName  ) =  firstName
Run Code Online (Sandbox Code Playgroud)

..像这样的东西......

kar*_*kfa 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"
Run Code Online (Sandbox Code Playgroud)