2010-05-28 3 views
4

Im haskell에 앱을 쓰는 중입니다. 사용자 입력이 괜찮습니까? 예를 들어 사용자 입력이 괜찮 으면 확인하는 것이 가장 좋습니다. 알고 싶습니다. 형성된 날짜? 정수에 대한 도움말사용자 입력 오류에 대한 haskell 검사

+0

도 참조를 http://stackoverflow.com/questions/2933157/nill-value-in-haskell 그것은 그 이름에도 불구하고 같은 질문을하고있다. – MtnViewMark

답변

3

간단한 방법에 대한

덕분에 "읽기"를 사용하는 것입니다.

type ReadS a = String -> [(a, String)] 

reads :: (Read a) => ReadS a 

아이디어는 읽기 클래스의 인스턴스 인 모든 유형의 당신은 그것에게 문자열을 전달하고 해당 유형으로 분석을 시도하는 것입니다 :이 유형이 있습니다. 예를 들어 정수 읽기의 인스턴스입니다, 그래서, 결과는 한 수에 항목과 나머지 문자열을 포함합니다 성공하면 당신은

reads :: String -> [(Integer, String)] 

로 유형 생각할 수 있습니다. 그래서 예를

값을 얻고, 다음은 정수를 못해서 불평 acatch - 모든 패턴 일치를 위해 귀하의 경우 [(V, "")]에 불과 패턴 일치에 따라서
reads "45xyz" = [(45, "xyz")] 

합니다.

날짜가 더 복잡합니다. 형식을 정의한 다음 "읽기"를 사용하여 인식 할 수있는 비트로 나눕니다.

+0

'reads'는 단지 하나의 엔트리 만 리턴한다고는 생각하지 않습니다. 가능한 여러 가지 구문을 반환 할 수 있습니다. 필자는 구현을 본 적이 없지만 Prelude의 형식 시그니처와 설명이 가능하다는 것을 분명히 암시합니다. 그러므로 나는 항상 @ Yitz의 maybeRead와 같은 함수를 사용한다. – MtnViewMark

+0

그게 전부입니다. 그러나 정수의 경우 0 또는 1 구문만을 반환합니다. 예상되는 구문 분석에 일치하므로 오류가 발생합니다. –

0

저는 Parsec이 명령 행 옵션 일 때이 작업을하기를 좋아합니다. 명령 줄이 문자열이 아니라 문자열의 목록이라는 점을 감안할 때 어떻게해야합니까? 첫째, 당신은 (대신 Char 목록의) String의 목록을 구문 분석에 대한 몇 가지 간단한 프리미티브를 작성해야 내가 하단에했던 것처럼

http://github.com/solidsnack/system-uuid/blob/master/Options.hs

그런 다음 당신이 당신의 옵션을 구문 분석하는 사람들을 작성할 수 있습니다 이 파일 :

http://github.com/solidsnack/system-uuid/blob/master/Main.hs

이 정말 그것을 할 수있는 가장 강력한 방법이며이 (모든 펄 프로그래머가 regexen에 있습니다만큼이나 무거운) 어떤 하스켈 프로그래머가 파서 콤비에서 만드는 무거운 투자를 활용합니다.

7

maybeRead을 사용하십시오. 이 함수는 Haskell 라이브러리에 포함 된 의 후보이지만 에는 아직 포함되지 않았습니다. 그것을위한 코드를 포함하십시오.

 
import Data.Time 
import Data.Maybe (listToMaybe) 
import System.IO (hSetBuffering, BufferMode(NoBuffering), stdout)

main = do hSetBuffering stdout NoBuffering putStr "Enter an Int: " maybeInt <- fmap maybeRead getLine :: IO (Maybe Int) maybe (putStrLn "That's not an Int!") (putStrLn . ("The Int is " ++) . show) maybeInt putStr "Enter a date: " maybeDate <- fmap maybeRead getLine :: IO (Maybe Day) maybe (putStrLn "That's not a date!") (putStrLn . ("The date is " ++) . show) maybeDate

maybeRead :: Read a => String -> Maybe a maybeRead = fmap fst . listToMaybe . filter (null . snd) . reads

+0

maybeRead (또는 eitherRead)를 기본으로 가져가는 데 어디에서 투표 할 수 있습니까? 정말 유용합니다. – ocharles

+0

maybeRead는 [Network.CGI.Protocol] (http://hackage.haskell.org/package/cgi-3001.1.8.)의 일부인 것처럼 보입니다.4/docs/Network-CGI-Protocol.html # v : maybeRead) – cimmanon

+0

'maybeRead'가 기본 라이브러리의'Text.Read'에 추가되었습니다. – Yitz

0

내가 그런 공백을 후행 수 있도록 다음과 같습니다 : 여기에 완벽한 솔루션입니다

import Data.Maybe 
import Data.Char 

maybeRead :: Read a => String -> Maybe a 
maybeRead = fmap fst . listToMaybe . filter (null . dropWhile isSpace . snd) . reads 
관련 문제