[parsing] Haskell의 Prelude.read가 Maybe를 반환하지 않는 이유는 무엇입니까?

Prelude.read 유형이 좋은 이유가 있습니까?

read :: Read a => String -> a

Maybe값을 반환하는 대신 ?

read :: Read a => String -> Maybe a

문자열이 Haskell을 구문 분석하지 못할 수 있으므로 후자가 더 자연스럽지 않을까요?

또는 Either String a, Left파싱하지 않으면 원래 문자열을 포함하고 Right그 결과를 포함하면 어디에 있습니까?

편집하다:

나는 다른 사람들이 나를 위해 상응하는 래퍼를 작성하도록하려는 것이 아닙니다. 그렇게하는 것이 안전하다는 확신을 구하는 것뿐입니다.



답변

편집 : GHC 7.6로, readMaybe에서 사용할 수 Text.Read와 함께, 기본 패키지 모듈 readEither: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v : readMaybe


좋은 질문입니다! 읽기 자체의 유형은 많은 것을 깨뜨릴 것이기 때문에 조만간 변경되지 않습니다. 그러나 기능 이 있어야 합니다 maybeRead.

왜 거기에 없습니까? 대답은 “관성”입니다. 이 있었다 ’08 토론 을 통해 토론에 의해 탈선되었다 “실패는.”

좋은 소식은 사람들이 도서관에서 실패에서 벗어나기 시작할만큼 충분히 확신했다는 것입니다. 나쁜 소식은 제안이 셔플에서 길을 잃었다는 것입니다. 하나는 작성하기 쉽지만 그러한 함수 가 있어야 합니다 (많은 코드베이스 주위에 매우 유사한 버전이 무수히 많이 있습니다).

이 토론을 참조하십시오 .

개인적으로 안전한 패키지 의 버전을 사용합니다 .


답변

예, Maybe를 반환하는 읽기 함수를 사용하면 편리합니다. 직접 만들 수 있습니다.

readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case reads s of
              [(x, "")] -> Just x
              _ -> Nothing


답변

관성 및 / 또는 변화하는 통찰력을 제외하고, 또 다른 이유는 show. 즉, 그것이 read . showID ( Show및 인스턴스 인 유형의 경우 Read)이고 show . read범위의 ID 인 show(즉 show . read . show == show)

Maybe유형에 a 가 있으면 read와의 대칭 이 끊어집니다 show :: a -> String.


답변

@augustss가 지적했듯이 자신 만의 안전한 읽기 기능을 만들 수 있습니다. 그러나 그의 readMaybe문자열 끝의 공백을 무시하지 않기 때문에 읽기와 완전히 일치하지는 않습니다. (이 실수를 한 번했는데 문맥이 잘 기억 나지 않습니다)

Haskell 98 보고서에서 읽기정의를 살펴보면와readMaybe 완벽하게 일치 하는을 구현하도록 수정할 수 있습니다. read의존하는 모든 함수가 Prelude에 정의되어 있기 때문에 이는 그리 불편하지 않습니다.

readMaybe        :: (Read a) => String -> Maybe a
readMaybe s      =  case [x | (x,t) <- reads s, ("","") <- lex t] of
                         [x] -> Just x
                         _   -> Nothing


답변

이 함수 (라고 함 readMaybe)는 이제 Haskell 전주곡에 있습니다! (현재 기준-4.6)


답변