Parsing 将字符串转换为自定义类型Haskell

Parsing 将字符串转换为自定义类型Haskell,parsing,haskell,tuples,Parsing,Haskell,Tuples,你好,我正在尝试转换这个字符串 Blade Runner,Ridley Scott,1982,Amy,5,Bill,8,Ian,7,Kevin,9,Emma,4,Sam,7,Megan,4​ 电影类型 type UserRatings = (String,Int) type Film = (Title, Director, Year , [UserRatings]) 来自包含25部影片的文本文件 这就是我试图做的 maybeReadTup :: String ->(String, I

你好,我正在尝试转换这个字符串

Blade Runner,Ridley Scott,1982,Amy,5,Bill,8,Ian,7,Kevin,9,Emma,4,Sam,7,Megan,4​
电影类型

type UserRatings = (String,Int) 
type Film = (Title, Director, Year , [UserRatings])
来自包含25部影片的文本文件

这就是我试图做的

maybeReadTup :: String ->(String, Int)
maybeReadTup s = do
  [(n, [c])] <- return $ reads s
  return [(n, [c])]

    parseLines :: [String] -> Film
    parseLines list 
            |  isInt(list !! 3) = (list !! 0,(list !! 1), read (list !! 2), maybeReadTup [ (list!!1,read (list !! 2) )])

isInt :: String ->Bool
isInt[] = True
isInt (x:xs)
    | isNumber x = True && isInt xs
    | otherwise = False

parseChars :: String -> String -> [String]
parseChars [] _ = []
parseChars (x:xs) stringCount
    | x == ',' = [stringCount] ++ parseChars xs ""
    | otherwise = (parseChars xs (stringCount ++ [x]))

parseAll :: [String] -> [Film]
parseAll [] = []
parseAll (x:xs) = parseLines (parseChars x "") : (parseAll xs)
MayberadTup::String->(字符串,Int)
MayberadTup s=do
[(n,[c])]胶片
语法行列表
|isInt(list!!3)=(list!!0,(list!!1),read(list!!2),maybeReadTup[(list!!1,read(list!!2)))
isInt::String->Bool
isInt[]=True
isInt(x:xs)
|isNumber x=True&&isInt xs
|否则=假
parseChars::String->String->[String]
parseChars[].[]
parseChars(x:xs)stringCount
|x==','=[stringCount]++parseChars xs“”
|否则=(解析字符xs(stringCount++[x]))
parseAll::[String]->[Film]
parseAll[]=[]
parseAll(x:xs)=parseLines(parseChars x“”):(parseAll-xs)

但是我弄错了类型。有人能帮我分析这个UserRatings元组类型吗?你能帮我理解语法行是如何工作的吗?我是Haskell的新手

这里有一个使用
Text.Parsec的解决方案:

import           Text.Parsec
import           Text.Parsec.String

type UserRatings = (String, Int)
type Title = String
type Director = String
type Year = Int
type Film = (Title, Director, Year, [UserRatings])

str :: Parser String
str = many1 (noneOf ",")

int :: Parser Int
int = read <$> many1 digit

tup :: Parser UserRatings
tup = do user <- str
         _ <- oneOf ","
         rating <- int
         return (user, rating)

parser :: Parser Film
parser = do title <- str
            _ <- oneOf ","
            director <- str
            _ <- oneOf ","
            year <- int
            _ <- oneOf ","
            ratings <- sepBy tup (oneOf ",")
            eof
            return (title, director, year, ratings)

testString :: String
testString = "Blade Runner,Ridley Scott,1982,Amy,5,Bill,8,Ian,7,Kevin,9,Emma,4,Sam,7,Megan,4"

main :: IO ()
main = print $ runParser parser () "testString" testString
import Text.Parsec
导入Text.Parsec.String
类型UserRatings=(字符串,Int)
类型标题=字符串
类型控制器=字符串
类型年份=整数
电影类型=(片名、导演、年份,[用户评级])
str::解析器字符串
str=many1(非“,”中的任何一个)
语法分析器int
int=读取多个1位数
tup::解析器用户等级

tup=do user为什么输入中的每个单词都用逗号分隔?@chepner有更好的方法吗?如果我更改文件,它会帮助我解析它吗?我会想象类似于
Blade Runner,Ridley Scott,1982,…
的东西会更好,这样你就知道标题的结尾和导演的开始(当然,假设标题不包含逗号)@chepner你是对的,我就是这么做的。这是一个打字错误。你知道我该怎么做吗?1。请编译您的文件或提供您无法理解的错误消息,2。问一个有意义的问题——“我搞错了类型”几乎不够具体,3。
parseLines
的缩进错误,4。你没有定义所有的东西——作者、头衔、年份都不见了——我可以猜出来。但是,请在发帖的时候至少表现出和你期望有人回复你一样的努力。对你的问题“有人能帮我吗”的一个有效但完全没有帮助的答案是“是的”。虽然我有一个数据库,但是“testString”对我来说是无用的。我如何修复这里的代码以将我的数据库放入解析器
main::IO()main=do tempDatabase调用文本文件数据库有点牵强<代码>电影列表