首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字符串转换为自定义类型Haskell

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

Stack Overflow用户
提问于 2016-03-09 22:08:02
回答 1查看 1.3K关注 0票数 1

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

代码语言:javascript
复制
Blade Runner,Ridley Scott,1982,Amy,5,Bill,8,Ian,7,Kevin,9,Emma,4,Sam,7,Megan,4​

设置为胶片类型

代码语言:javascript
复制
type UserRatings = (String,Int) 
type Film = (Title, Director, Year , [UserRatings])

来自一个包含25部影片的文本文件

这就是我想要做的

代码语言:javascript
复制
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)

但是我搞错了类型,有人能帮我解析一下这个UserRatings元组类型[(String,Int)]吗?你能帮我理解一下parseLines是如何工作的吗?我是新来哈斯克尔的

EN

回答 1

Stack Overflow用户

发布于 2016-03-09 23:14:50

这是一个使用Text.Parsec的解决方案

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35893862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档