Haskell最短列表实例化方法及Person类型列表简化写法咨询
嘿,这两个问题都是Haskell里常见的代码简洁化需求,我来给你拆解清楚:
1. Haskell中实例化列表的最短写法
不同场景下的最短写法不一样,给你列几个最常用的:
- 空列表:直接写
[],这绝对是最短的 - 单元素列表:用
[x],比手动拼x : []短太多 - 多元素同类型列表:直接用逗号分隔元素,比如
[1,2,3]或["foo", "bar"] - 重复元素的列表:用
replicate n x,比如replicate 5 0等价于[0,0,0,0,0],比手动写n次高效多了 - 连续枚举的数值/字符列表:用范围语法,比如
[1..10](生成1到10的整数)、['a'..'z'](生成所有小写字母),省去逐个输入的麻烦
2. 简化Person记录列表的定义
你说的重复写name和age确实冗余,这里给你三种实用的简化方式,按简洁度排序:
方法1:构造器+zipWith(最清爽)
虽然你用了记录语法定义Person,但它的构造器本质上还是一个String -> Int -> Person的函数。所以我们可以把名字和年龄分成两个列表,用zipWith把对应位置的元素组合成Person实例:
people = zipWith Person ["Alice", "Bob", "Mallory"] [27, 23, 26]
一行搞定,完全不用重复写字段名,非常简洁。
方法2:自定义辅助构造函数
如果觉得直接用构造器的参数顺序不够直观(怕别人搞混名字和年龄的顺序),可以自己写一个语义更清晰的辅助函数:
-- 先开启NamedFieldPuns扩展(可选,但能省代码) {-# LANGUAGE NamedFieldPuns #-} person :: String -> Int -> Person person name age = Person {name, age} -- 扩展开启后,不用写name=name、age=age -- 然后创建列表就很简单了 people = [person "Alice" 27, person "Bob" 23, person "Mallory" 26]
如果不想开扩展,就写Person {name = name, age = age}也可以,只是多几个字符而已。
方法3:记录更新语法
如果你的列表里大部分Person实例有相同的字段值(比如默认年龄都是0),可以先定义一个默认实例,然后每次只修改需要的字段:
defaultPerson :: Person defaultPerson = Person {name = "", age = 0} -- 随便设置一个默认值 people = [ defaultPerson {name = "Alice", age = 27} , defaultPerson {name = "Bob", age = 23} , defaultPerson {name = "Mallory", age = 26} ]
这种方法适合字段较多、大部分字段值相同的场景,比每次全写字段名要省不少事。
内容的提问来源于stack exchange,提问作者vasilyrud
相关产品推荐
相关产品推荐

