访问数据属性[Haskell]

h5qlskok  于 2023-03-08  发布在  其他
关注(0)|答案(2)|浏览(190)

我定义了一个名为Name的数据类型,它由类型同义词FirstName和LastName组成。
我如何打印出名字?我知道如何用记录语法打印,但不知道如何用默认语法打印。

type FirstName = String
type LastName = String

data Name = Name FirstName LastName

main = do 
      tim <- Name "tim" "lim"
      putStrLn (FirstName tim)

出现以下错误:

test.hs:11:17: error:
    Data constructor not in scope: FirstName :: t0 -> String
   |
11 |       putStrLn (FirstName tim)
   |                 ^^^^^^^^^
nlejzf6q

nlejzf6q1#

例如,使用模式匹配来解包:

type FirstName = String
type LastName = String

data Name = Name FirstName LastName

main = do 
      let Name fn _ = Name "tim" "lim"
      putStrLn fn

但是对于您的Name,使用记录可能会更好:

data Name = Name { firstName :: FirstName, lastName :: LastName }

然后Haskell会自动生成两个函数firstName :: Name -> FirstNamelastName :: Name -> LastName,这样你就可以把这个函数用于:

main = do 
      let tim = Name "tim" "lim"
      putStrLn (firstName tim)

使用记录语法的主要优点是,你可以很容易地从数据构造函数中获得一个字段,而不必解压缩数据构造函数,也不必处理所有的字段。如果字段的数量增加,可能需要一些额外的工作来重构你最初使用非记录语法的所有地方。

注意:此处不能使用类似tim <- Name "tim" "lim"的语法,因为Name不是返回一元值的函数)。

yrdbyhpb

yrdbyhpb2#

如果您没有定义记录访问者,那么访问它的字段的唯一方法是模式匹配:

type FirstName = String
type LastName = String

data Name = Name FirstName LastName

main = do 
      let tim = Name "tim" "lim"
      putStrLn (case tim of Name fname lname -> fname)

相关问题