를 사용하면 코드입니다 :모나드 순위-2 타입 여기
{-# LANGUAGE RankNTypes, FlexibleContexts, ScopedTypeVariables #-}
module Foo where
import Data.Vector.Generic.Mutable as M
import Data.Vector.Generic as V
import Control.Monad.ST
import Control.Monad.Primitive
import Control.Monad
data DimFun v s r =
DimFun {dim::Int, func :: v (PrimState s) r -> s()}
runFun :: (Vector v r) =>
(forall s . (PrimMonad s) => DimFun (Mutable v) s r) -> v r -> v r
runFun t x = runST $ do
y <- thaw x
evalFun t y
unsafeFreeze y
evalFun :: (PrimMonad s, MVector v r) => DimFun v s r -> v (PrimState s) r -> s()
evalFun (DimFun dim f) y | dim == M.length y = f y
fm :: (MVector v r, PrimMonad s, Num r, Monad m) => m (DimFun v s r)
fm = error ""
f :: forall v r m . (Vector v r, Num r, Monad m) => m (v r -> v r)
f = liftM runFun $ (fm :: forall s . (PrimMonad s) => m (DimFun (Mutable v) s r))
이 오류가 발생합니다
Couldn't match type ‘DimFun (Mutable v) s0 r’
with ‘forall (s :: * -> *). PrimMonad s => DimFun (Mutable v) s r’
Expected type: DimFun (Mutable v) s0 r -> v r -> v r
Actual type: (forall (s :: * -> *).
PrimMonad s =>
DimFun (Mutable v) s r)
-> v r -> v r
Relevant bindings include
f :: m (v r -> v r) (bound at Testing/Foo.hs:36:1)
In the first argument of ‘liftM’, namely ‘runFun’
In the expression: liftM runFun
는 그러나, 나는 수정하거나 문제를 진단하는 방법을 잘 모르겠어요. 좋은 장소 (잘 쓰여진) 형식의 서명처럼 간단 할 수도 있습니다.
무슨 일이 있었는지 알아 내려고하는 동안, 나는 (나에게 쓸모없는) 비 모나드 버전을 쓸 수 있지만 그것은 컴파일 :
gm :: (MVector v r, PrimMonad s, Num r) => DimFun v s r
gm = error ""
g :: forall v r m . (Vector v r, Num r) => v r -> v r
g = runFun (gm :: forall s . (PrimMonad s) => DimFun (Mutable v) s r)
이 나 일을하게 위의 this question와 관련된 오류 사전은 갈 곳이 없지만 어둠 속에서 그저 찌르는 것입니다.
이중 게시를 한 것처럼 보입니다. 이것은 아마 삭제되어야하고 대답은 여기에 있습니다 : http://stackoverflow.com/questions/24744294/pattern-matching-on-rank-2-type – jberryman
@jberryman이 두 질문의 문제점은 관련이 있습니다. 코드의 일부 하위 집합이 실제로 동일 함에도 불구하고). 그것이 내가 두 가지 질문으로 게시 한 이유입니다. – crockeea
범위가 지정된 유형 변수를 사용하여 첫 번째 인수의 유형을 수정합니다. 또한'forall'을'runFun'을위한 전역 범위로 분해 해보십시오. – nomen