从文本值列表中创建记录
Make a record from a list of Text values
从文本列表开始,我想将其转换为记录,其中每个字段对应于列表中的一个值。
import Data.Text
data MyRecord = MyRecord {
rOne :: Text,
rTwo :: Text,
rThree :: Int
}
txt :: [Text]
txt = ["foo", "bar", "12"]
我不确定如何(干净利落地)从文本列表进行到记录。假设这个列表将始终具有相同的大小(此处为 3),并且在第三个位置将始终有一个类似 Int 的值。
我所拥有的最小的天真工作版本是如此的骇人听闻,以至于我不能放弃将其提交到代码库中:
-- assuming RecordWildCards
readText :: [Text] -> MyRecord
readText l =
let rOne = l !! 0
rTwo = l !! 1
rThree :: Int = read $ l !! 2
in MyRecord {..}
什么是 Haskell 更友好的方式?
注意:我实际上是在将逗号分隔的文件解析为 MyRecord
列表,而无需 csv 库。这些行不会在值中包含逗号,因此在这里可以认为以逗号分隔是安全的(例如 values = T.splitOn "," <$> lines
)。
如果您完全确定列表的长度为三个元素,您可以使用
readText :: [Text] -> MyRecord
readText [rOne, rTwo, rThreeText] = MyRecord {..}
where rThree :: Int = read rThreeText
不过,您可能希望使模式匹配详尽无遗,以防万一:
readText :: [Text] -> MyRecord
readText [rOne, rTwo, rThreeText] = MyRecord {..}
where rThree :: Int = read rThreeText
readText _ = error "readText: list length /= 3"
从文本列表开始,我想将其转换为记录,其中每个字段对应于列表中的一个值。
import Data.Text
data MyRecord = MyRecord {
rOne :: Text,
rTwo :: Text,
rThree :: Int
}
txt :: [Text]
txt = ["foo", "bar", "12"]
我不确定如何(干净利落地)从文本列表进行到记录。假设这个列表将始终具有相同的大小(此处为 3),并且在第三个位置将始终有一个类似 Int 的值。
我所拥有的最小的天真工作版本是如此的骇人听闻,以至于我不能放弃将其提交到代码库中:
-- assuming RecordWildCards
readText :: [Text] -> MyRecord
readText l =
let rOne = l !! 0
rTwo = l !! 1
rThree :: Int = read $ l !! 2
in MyRecord {..}
什么是 Haskell 更友好的方式?
注意:我实际上是在将逗号分隔的文件解析为 MyRecord
列表,而无需 csv 库。这些行不会在值中包含逗号,因此在这里可以认为以逗号分隔是安全的(例如 values = T.splitOn "," <$> lines
)。
如果您完全确定列表的长度为三个元素,您可以使用
readText :: [Text] -> MyRecord
readText [rOne, rTwo, rThreeText] = MyRecord {..}
where rThree :: Int = read rThreeText
不过,您可能希望使模式匹配详尽无遗,以防万一:
readText :: [Text] -> MyRecord
readText [rOne, rTwo, rThreeText] = MyRecord {..}
where rThree :: Int = read rThreeText
readText _ = error "readText: list length /= 3"