2014-06-13 4 views
1

저는 하스켈 세계에 처음 오릅니다. 체커 보드를 기반으로 한 게임을 만들어야하고 전역 변수 (보드를 나타내는 배열)를 정의하고 싶습니다. 이 배열을 정의하고 함수에서 사용 (수정)하는 방법을 알고 있습니까?Haskell에서 전역 배열을 정의하고 사용하는 방법은 무엇입니까?

제발 도와주세요. 여기에 언급 한 바와 같이

+4

질문은 당신이 하스켈이 어떻게 작동하는지 익숙하지 않다는 것을 나타냅니다. [lyahfgg] (http://learnyouahaskell.com/)와 같은 일부 소개 작품을 살펴 보시기 바랍니다. – Cubic

+0

네, 맞습니다. 나는이 튜토리얼을 읽었으며 "변수의 값을 변경하면 어떤 종류의 거짓말이 될 수있다"는 것을 이해하지만 실제로 전역 접근을 통해 ** 가변 배열 **을 만드는 방법을 알아야합니다. – mankers

+0

전역 액세스 가능한 변경 가능한 배열을 실제로 만들어야하는 유일한 경우는 FFI로 작업 할 때입니다. FFI와 일하고 있습니까? – Carl

답변

4

글로벌 변수의 개념은 함수형 프로그래밍에서 권장되지는 않지만, 당신은 모나드을 this 솔루션에서 모양과 상태를 사용할 수 있습니다

import Control.Monad.State 
import qualified Data.Map as Map 

funcs :: Map.Map String Double 
funcs = Map.empty 

f :: String -> Double -> State (Map.Map String Double)() 
f str d = do 
    funcs <- get 
    put (Map.insert str d funcs) 

g :: State (Map.Map String Double) String 
g = do 
    funcs <- get 
    if (Map.lookup "aaa" funcs) == Nothing then return "not defined" else return "ok" 

main = putStrLn $ flip evalState funcs $ do {f "aaa" 1; g} 
+2

"State"는 실제 배열에서 다소 나쁘게 작동한다는 점에 유의해야합니다. 업데이트는 순전히 기능적으로 수행됩니다. 즉 배열의 단일 구성원에 대한 모든 변경은 _O_ (_n_)입니다. 여러분이 제안한'Data.Map'은 이와 관련하여 더 낫습니다. _O_ (log _n_) 업데이트가 있습니다. 실제 성능에 중요한 요소의 경우에는 전용 [변경 가능한 배열 유형] (http://hackage.haskell.org/package/vector-0.10.11.0/docs/Data-Vector-Mutable.html) 중 하나를 사용해야하며, _O_ (1) 업데이트를가집니다 (그러나 그것들은'ST' 또는'IO' 모나드에서만 작동합니다). – leftaroundabout

+0

아주 잘 수행하는 또 다른 옵션은'IntMap'을 사용하는 것입니다. 이것은 Enum 인스턴스 (예 : enummapset-th 패키지) 또는 Hashable 인스턴스 ('unordered-containers')와 같은 정수형과 동일한 유형의 키로 일반화 할 수 있습니다. –

관련 문제