2016-12-07 1 views
4

에서 입력을 사용내가 코드를 Haskeline의 getInputLine

내가 오류 얻을 그러나 과정은 타입 정의

process :: [String] -> IO() 

있다

main :: IO() 
main = runInputT defaultSettings loop   
where           
    --loop :: InputT IO()      
    loop = do         
    minput <- getInputLine "$ "    
    case minput of       
     Nothing -> return()     
     Just input -> process $ words input   
    loop          

: 나는 궁금했다

• Couldn't match type ‘IO’ with ‘InputT m’              
Expected type: InputT m()                  
    Actual type: IO()                   
• In the expression: process $ words input              
In a case alternative: Just input -> process $ words input          
In a stmt of a 'do' block:                  
    case minput of {                    
    Nothing -> return()                  
    Just input -> process $ words input } 

을 아무도 내가 뭘 잘못하고 있는지 설명 할 수는 없어. 다른 것들을하기 위해 getInputLine의 원시 입력을 원한다.

감사

+1

'liftIO (프로세스 $ 단어 입력)'을 사용해보십시오. – melpomene

+1

그 트릭을 할 것으로 보인다. 감사합니다. 정확히 무엇을 설명 하시겠습니까? – Wolfe

답변

6

do 블록의 모든 내용은 (물론, 자신의 유형에 같은 모나드가 있어야합니다) 같은 유형이 있어야합니다. 귀하의 경우, InputT IO something (모나드가 InputT IO)입니다.

getInputLine "$ "InputT IO (Maybe String)이므로이 부분은 정상입니다.

그러면 case 표현이 있습니다. 즉, 모든 분기가 동일한 유형이어야 함을 의미합니다. 첫 번째 분기는 return()이며, 형식은 InputT IO()입니다. 지금까지 좋은 모든 것.

두 번째 분기는 process $ words input입니다. 그러나이 유형은 이 아니라 InputT IO()이 아니며이 시점에서 컴파일러가 예상합니다.

는이 문제를 해결하려면 : 다행히 liftIO 기능입니다 InputT IO x에 ("리프트") 유형 IO x의 값을 변환하는 쉬운 방법, 거기 :

Just input -> liftIO (process $ words input) 

, liftIO :: IO a -> InputT IO a이다 (실제로는 더 일반적이다 그것보다 : liftIO :: (MonadIO m) => IO a -> m a하지만 여기서는 중요하지 않습니다.)

+0

좋습니다. 무리 감사! – Wolfe