program tip

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

radiobox 2020. 8. 18. 07:31
반응형

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부터는 다음 과 함께 기본 패키지 readMaybeText.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)

참고 URL : https://stackoverflow.com/questions/8066850/why-doesnt-haskells-prelude-read-return-a-maybe

반응형