2012-12-14 4 views
2

오른쪽 문자열을 변환하는 데 어려움을 겪고 있습니다. 나는 수학 식 (기본적으로 String)를 평가 getEval라는 방법이 있고, 다음과 같이 나는 그것을 다시 얻을 :오른쪽 문자열을 부동으로 변환

*Main> getEval "3+6" 
Right "9" 

getEval의 유형 getEval은 다음과 같습니다

*Main> :t getEval "3+6" 
getEval "3+6" 
:: (Functor m, Control.Monad.CatchIO.MonadCatchIO m) => 
    m (Either InterpreterError String) 

입니다 :

getEval str = runInterpreter $ setImports ["Prelude"] >> eval str 

getEval은 하스켈의 힌트 라이브러리 (Language.Haskell.Interpreter)에서 eval을 사용하여 실제 구문 분석 및 계산을 수행합니다. 어떻게 이것을 부유물에 넣을 수 있습니까?

+2

'liftM read (getEval "3 + 6")'. ghci 유형 서명을 제공해야 할 수도 있습니다. –

+0

liftM이란 무엇입니까? – Niklas9

+1

첫 번째로'Functor' 제약 조건을 간과했기 때문에'fmap'과 의미 상 (의미 상) 같습니다. (모나드 버전도 마찬가지였습니다). 그 타입은'liftM :: Monad m => (a -> b) -> m a -> m b'입니다. –

답변

2
getEval str = do 
     Right res <- Interpreter.runInterpreter (Interpreter.setImports 
       ["Prelude"] >> Interpreter.interpret str (Interpreter.as :: 
       Float)) 
     return res 
-2
case getEval "3+6" of 
    Right value = read value :: Float 
    Left errstr = error ("Interpreter error" ++ errstr) 

기대하는대로해야합니다. Read 구문 분석 오류가 염려되는 경우 readsPrec을보고 싶을 것입니다.

+1

구문이 잘못되었습니다. 'case'는'= '이 아니라'-'를 사용합니다. – kosmikus

+2

그리고'getEval'은'm (Either ...)'를 반환합니다. –