Сопоставление с образцом для пользовательской функции чтения - PullRequest
1 голос
/ 02 апреля 2010

Я пишу пользовательскую функцию чтения для одного из типов данных в моем модуле. Например, когда я делаю read "(1 + 1)" :: Data, я хочу вернуть Plus 1 1. Моя декларация данных data Data = Plus Int Int. Спасибо

Ответы [ 3 ]

6 голосов
/ 02 апреля 2010

Это звучит как что-то более подходящее для парсера; Parsec - мощная библиотека комбинаторов анализаторов Haskell, которую я бы порекомендовал.

3 голосов
/ 02 апреля 2010

Я бы хотел поддержать идею использования парсера. Однако, если вам абсолютно необходимо использовать сопоставление с шаблоном, сделайте так:

import Data.List

data Expr = Plus Int Int | Minus Int Int deriving Show

test = [ myRead "(1 + 1)", myRead "(2-1)" ]

myRead = match . lexer
  where
    match ["(",a,"+",b,")"] = Plus (read a) (read b)
    match ["(",a,"-",b,")"] = Minus (read a) (read b)
    match garbage           = error $ "Cannot parse " ++ show garbage

lexer = unfoldr next_lexeme
  where 
    next_lexeme ""  = Nothing
    next_lexeme str = Just $ head $ lex str
2 голосов
/ 02 апреля 2010

Вы можете использовать GHC ReadP .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...