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 . show
ID ( 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