从文本值列表中创建记录

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"