2015-01-01 2 views
1

유형 동의어 카드은 튜플로 구성되어 있습니다. 또한 유형 동의어 데크은 [카드] (카드 목록)로 정의됩니다.하스켈 IO 목록 요소 받기

파일 읽기 때문에 IO 모나드가 붙어 있습니다. 구체적으로 IO 덱 유형의 개체가 있습니다. 카드 목록의 개별 요소를 어떻게 검색합니까? 입출력 모나드 때문에 유형을 더 이상 목록으로 보이지 않으므로 사용할 수 없습니다 !! 운영자.

{-# LANGUAGE ScopedTypeVariables #-} 

testFun :: IO Deck 
testFun = do 
    (x :: Deck) <- someDeck 
    -- Operate here on the x value     
    return [] 

<-IO Deck에서 Deck을 추출합니다 :

type Card = (Int, Int) 

type Deck = [Card] 

someDeck :: IO Deck 
someDeck = undefined -- Some sample IO Deck which you have (from reading file etc.) 

는 그런 다음이 Deck에 액세스 할 수 모나드 할 표기법을 사용할 수 있습니다 이러한 가정

+2

'fmap (!! x) ioDeck' 또는'ioDeck >> = (\ deck -> 데크와 함께 할 일)' –

+0

모나드를 조작하는 방법은 http://learnyouahaskell.com에서 찾을 수 있습니다./a-fistful-of-monads – AJFarmar

답변

4

여기에 귀하의 주요 문제는 단순히 모나드를 조작하는 방법을 모른다, 그래서 여기에 몇 가지 포인터는 다음과 같습니다

모나드가들을 수 있도록 몇 가지 기능을 가지고 있습니다 조작되다. 이것들은 모나드 타입 클래스 인 return>>= (별칭은 'bind')에 정의 된 기본 요소들에서 비롯됩니다.

return은 모나드를 허용하고, >>=은 먼저 모나드를 취한 다음 모나드를 구성하는 함수를 취하여 주어진 값에 함수를 적용합니다. 이것은 당신이 당신의 케이스에 넣어 사용하는 것이 한 방법입니다 :

-- Imagine your list to be here: 
ioList :: IO [Int] 
ioList = return [1,2,3,4,5] 

-- If we were to print the second element... 
main = ioList >>= (\a -> return (a !! 1)) >>= print 

-- We could write this in do-notation, syntactic sugar for the above: 
main = do 
    list <- ioList 
    print (list !! 1) 

하나 또한 함수를 취하고과 같이 모나드에 적용 Control.Monad에서 기능 liftM을 사용할 수

import Control.Monad 
main = print (liftM (!! 1) ioList) 

모나드를 조작하는 다른 방법뿐만 아니라 관련된 다양한 유형의 서명에 대한 설명은 물론 표기법과 나머지도 찾을 수 있습니다. here.

+0

"모나드를 조작하라"라고 말하는 것은 약간 잘못된 것 같습니다. 모나드는 한번 쓰고 모든 것, 수학적 개념입니다. 여러분은 그것을 조작 할 수 없습니다! _monadic values_ (일명 _actions_; 나는 그게 당신이 여기서 말하는 의미라고 생각합니다)도 조작 할 수 없습니다. '>> ='와 같은 연산자는 그러한 조작을 조작하지 않고 _ 조합합니다. – leftaroundabout

+0

@leftaroundabout 사실이지만 초보자 수준에서는 행동을 결합하는보다 기본적인 방법으로 생각하는 것이 좋습니다. 나는 확실히 이전의 방식으로 생각하는 것이 더 쉬운 것을 알 수 있습니다. – AJFarmar

+0

필터링에 어떻게 적용 하시겠습니까? 필자는 _filter 술어 iolist_를 사용합니다. 여기서 iolist는 IO 덱이고 술어는 Card -> Bool입니다. liftM을 사용해 보았지만 작동하지 않았습니다. – wolx

0

는 유형입니다. x의 유형은 Deck입니다. let 식에서 순수 함수를 적용 할 수 있습니다. 또 다른 방법은 훨씬 더 간단하지만 직관적이지 않은 fmap을 사용하는 것입니다.

1

게임 자체에서 데크를로드하는 데 사용하는 코드를 분리 한 다음 어딘가에 함께 결합해야합니다. 템플릿이 될 수있다 :

import System.Environment (getArgs) 

solve :: Deck -> Deck 
solve deck = -- do something here 

loadDeckFromFile :: FilePath -> IO Deck 
loadDeckFromFile fp = -- load deck code here 

main :: IO() 
main = do 
    deckFile <- fmap head getArgs 
    deck <- loadDeckFromFile deckFile 
    let solvedDeck = solve deck 

    putStrLn "Starting deck:" 
    print deck 
    putStrLn "\nSolved deck:" 
    print solvedDeck