Я анализирую файл, который выглядит так:
Good
id123
^
Bad
id456
^
Middle
id789
Записи разделены ^\n
, и поля в этой записи
отделяются просто newlines
.
Читая этот файл и разбивая его, я получаю список списков, который выглядит следующим образом:
[["Good","id123",""],["Bad","id456",""],["Middle","id789",""]]
Однако мне не удается превратить это в список типов Rec.
Вот мой код:
{-# LANGUAGE DeriveGeneric, OverloadedStrings #-}
import Data.Text as T
import Data.Text.IO as T
data Rec = Rec Text Text Text deriving Show -- simple
main :: IO ()
main = do
contents <- T.readFile "./dat.txf"
let seps = splitOn "^\n" contents
let recs = fmap (splitOn "\n") seps
print recs
main
Производит
[["Good","id123",""],["Bad","id456",""],["Middle","id789",""]]
Как и ожидалось. Но пытаясь перейти к следующему шагу и превратить их в Recs, с:
main_ :: IO ()
main_ = do
contents <- T.readFile "./dat.txf"
let seps = splitOn "^\n" contents
let recs = fmap (splitOn "\n") seps
print recs
print $ fmap (\(x, y, z) -> Rec x y z) recs
-- print $ fmap (\r -> Rec r) recs
-- let m = fmap (\x -> Rec [(x,x,x)]) recs
-- print m
-- print $ fmap (\x -> Rec t3 x) recs
-- where t3 [x,y,z] = (x,y,z)
main_
Я получаю:
<interactive>:7:44: error:
• Couldn't match type ‘[Text]’ with ‘(Text, Text, Text)’
Expected type: [(Text, Text, Text)]
Actual type: [[Text]]
• In the second argument of ‘fmap’, namely ‘recs’
In the second argument of ‘($)’, namely ‘fmap (\ (x, y, z) -> Rec x y z) recs’
In a stmt of a 'do' block: print $ fmap (\ (x, y, z) -> Rec x y z) recs
или
main__ :: IO ()
main__ = do
contents <- T.readFile "./dat.txf"
let seps = splitOn "^\n" contents
let recs = fmap (splitOn "\n") seps
print recs
print $ fmap (\x -> Rec (f x)) recs
where f [a,b,c] = (a,b,c)
main__
<interactive>:7:30: error:
• Couldn't match expected type ‘Text’ with actual type ‘(Text, Text, Text)’
• In the first argument of ‘Rec’, namely ‘(f x)’
In the expression: Rec (f x)
In the first argument of ‘fmap’, namely ‘(\ x -> Rec (f x))’
Чего мне не хватает, чтобы превратить [[Text]]
в [Rec]
?