2013-10-26 1 views
0

좋아, 그럼 내가 문자열을 사용하고 텍스트 파일에 의해 지정된 해당 문자열의 특정 값을 반환하는 함수가 있다고 가정 해 봅시다. 텍스트 파일은 다음과 같습니다.또 다른 haskell 입출력 문제

안녕하세요 - 2
안녕 -

3 그래서 함수는 2 "안녕하세요"주어진 3가 "안녕"주어진 반환합니다. 이제,이 함수는 (이 프레임 워크의 일부이며 나는 그것을 변경할 수 없습니다) 타입의 무게이다 :

type Weight = String -> Int 

나는 그것이 유형 무게의되어야 주어진 같은 기능을 구현하려면 어떻게합니까. 문제는 특정 문자열이 주어질 때 어떤 값을 반환할지 무게를 인식하는 방법을 모르겠다는 것입니다. 값이 다른 텍스트 파일에서 달라 지므로 값을 하드 코딩 할 수 없습니다. 그리고 함수 내에서 파일을 읽거나 읽을 수는 없습니다. 다른 옵션이 있습니까?

답변

3

당신은 두 가지 선택이,

assignWeight :: String -> IO Int 
assignWeight = do 
    file <- readFile whatever 

    -- parse file and extract a function assigning strings to their weights 
    return $ parseFile file 

또는

assignWeight :: String -> Weight 
assignWeight file = parseFileAndExtractWeights file 

다음은 main 사용 태닝에서 파일을 읽습니다. 그래서하지 최상위 기능이있다, 그러나 우리는 여전히 부분적으로 파일

main = do 
    weights <- assignWeight `fmap` readFile whatever 
    -- use weights 

의 내용에 assignWeight을 적용하여 나중에 우리의 기능을 얻을하지만 당신은 유형 Weight의 계산에 IO를 수행 할 수 없습니다, 그래서 당신은거야 중 하나가 다른 곳에서 그것을 수행하고 유형을 전달하거나 유형을 변경하십시오. 그것에 대해 다른 방법은 없습니다.

+0

'>> = ReadFile을 어떤 창 : 여기

더 모듈 접근법이다. assignWeight'는'assignWeight <$> readFile 뭐든간에'로 쓸 수 있습니다. – kqr

+0

고마워, 그게 내가 생각했던거야. 불행히도 이들 중 어느 것도 만족스럽지 않으므로 몇 가지 대안을 찾아야 할 것입니다. 난 그냥 파일의 내용을 읽은 후에 변경되지 않기 때문에 어떻게 든 전역 변수를 시뮬레이션 할 수 있다고 생각했습니다. 그러나 나는 이것을 할 길을 볼 수 없다. – redFur

+0

@ user2922609 수 없습니다. Haskell은 이런 종류의 돌연변이를 허용하지 않는다. – jozefg

0

assignWeight을 전 세계로 가질 수는 없지만 원하는 비 -IO 유형으로 로컬로 설정할 수 있습니다. 아래의 접근 방식은 모나드 코드를 모나드가 아닌 코드와 구분하는 데 사용되는 일반적인 패턴이라고 생각합니다.

import Data.Maybe 
import Control.Applicative 

parseFile :: IO [(String, Int)] 
parseFile = read <$> readFile "Parse.txt" 

main = do 
     content <- parseFile 
     let assignWeight x = fromJust $ lookup x content 
     print $ process assignWeight 

type Weight = String -> Int 

process :: Weight -> Int 
process x = 0 

여기서 assignWeight은 올바른 유형입니다. 당신은 그것을 전달할 수 있습니다 : 모나드가 아닌 다른 사람들에게 어떻게 전달했는지보세요 process 함수. assignWeight을 순도를 위반하지 않고 최상위 수준에서 정의 할 수는 없지만 다른 의견 제시 자들이 지적했듯이 로컬로 전달하고 전달하는 것은 일반적으로 사용되는 방법입니다.

getAssignWeight :: IO Weight 
getAssignWeight = do 
     content <- parseFile 
     let assignWeight x = fromJust $ lookup x content 
     return assignWeight 

main = do 
     assignWeight <- getAssignWeight 
     print $ process assignWeight