2017-10-25 22 views
1

POMDP에 대해 open source library을하고 있습니다. 두 번째 공간에서 일부 비용 기능을 사용하여 검색하려면 후드 아래 Dynamic Programming을 사용합니다.하스켈에서 Monad.Memo와 Reader를 통해 환경을 결합하십시오.

DP 구현은분기는 하스켈의 지연 평가를 사용하는 DP 메모 작성의 경우 MemoTrie을 기반으로합니다. 그리고 나는 조정할 수있는 비용 함수가 필요하다. 나는 이것이 MemoTrie의 게으른 접근법과 잘 어울리지 않을 것이라고 믿는다. 나는 순진한 try을했지만 예상대로 초 대신 모든 테스트를 통과하는 데 몇 시간이 걸립니다.

저는 모나드 접근 방식을 Monad.Memo으로 결정했습니다. Here is Reader Context를 사용하지 않아도 작동하는 첫 번째 시도. 하지만 이제는이 계산을 위해 Reader 컨텍스트를 소개하는 올바른 방법으로 고민하고 있습니다.

try 나는 MonadReader를 소개하기 위해 제약 조건을 사용했습니다. 동시에 나는 fq와 fv에 대한 상호 재발을 제약으로 기술 할 수 없었고 단지 fq만을 메모하려고 시도했다. 그러나 MonadMemo의 MonadReader 유형 클래스 구현은 Reader 컨텍스트를 키의 일부로두고 내 컨텍스트는 함수이기 때문에 매핑 키의 일부가 될 수 없습니다. Writer 모나드에만 물건을 포장 할 수있었습니다 :

:t fst . startEvalMemo . runWriterT $ fq 1 1 1 

그리고 판독기의 포장을 풀기 위해 더 이상 갈 수 없었습니다.

마지막 시도 나는 시도했습니다 use ReaderT. 그러나이되지 컴파일 그래서 나는 하스켈에서 생산성 사투를 벌인거야하지만 내가이 날 데려가 오랜 시간 같은 질문을 배우고로

• Occurs check: cannot construct the infinite type: v ~ [v] 
    arising from a functional dependency between: 
     constraint ‘MapLike 
        (containers-0.5.7.1:Data.Map.Base.Map (n, n, n) [v]) (n, n, n) v’ 
     arising from a use of ‘memol1’ 
     instance ‘MapLike (containers-0.5.7.1:Data.Map.Base.Map k v1) k v1’ 
     at <no location info> 
• In the first argument of ‘for3’, namely ‘memol1’ 
    In the expression: for3 memol1 fv n 
    In an equation for ‘v’: v = for3 memol1 fv n 
• Relevant bindings include 
    v :: n -> n -> ReaderT (DynamicEnv n v) (MemoQV n v) v 
     (bound at src/Dynamic.hs:136:9) 

같은 물건을 제공합니다. 당신의 충고를 기쁜 마음으로 듣겠습니다!

답변

1

ReaderT을 사용하는 버전에서 Dynamic 모나드는 MemoQV 주위에 하나 더 많은 레이어가 있습니다.

type R = ReaderT (DynamicEnv n r) 
type L1 = MemoQ n r 
type L2 = MemoV n r 

우리는 "상부"지금 반대로 0 , Dynamic부터부터 계산 변압기 번째 전에

L1 (L2 Identity) 
-- 0 1 

닮은 형태 :와

의사 하스켈

, 모양은 다음과 같습니다.

R (L1 (L2 Identity)) 
-- 0 1 2 

상단에 변압기 R이 있었는데, 캐시 변압기가 더 멀리 이동했다.

memol0, memol1memol2 콤비에게 중요한 : memolN는 이러한 층이 이동하면 그에 따라 코드를 업데이트해야하므로, (따라서 일치하는 유형이 예상 됨) N 번째 레이어를 사용하여 계산을 memoizes.

memol1 herememol0 here을 사용합니다. 파일을 memol2memol1까지 각각 이동할 때 파일이 컴파일됩니다.

+0

고맙습니다. 그게 문제를 해결합니다! – aliko