Dưới đây là các mã:Sử dụng một monadic rank-2 loại
{-# 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))
Điều này dẫn đến lỗi:
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
Tuy nhiên, tôi không chắc chắn làm thế nào để sửa chữa hoặc chẩn đoán vấn đề. Nó có thể đơn giản như một chữ ký loại tốt (và được viết tốt).
Trong khi cố gắng tìm ra những gì đang diễn ra, tôi viết một phiên bản không monadic (vô ích cho tôi), nhưng nó biên dịch:
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)
Điều này làm cho tôi điều các lỗi trên có liên quan đến this question nơi không có chỗ cho từ điển để đi, nhưng đó thực sự chỉ là một đâm trong bóng tối.
Có vẻ như bạn có thể đã thực hiện một bài đăng kép. Điều này có lẽ nên được xóa và câu trả lời đi ở đây: http://stackoverflow.com/questions/24744294/pattern-matching-on-rank-2-type – jberryman
@jberryman Nó không rõ ràng với tôi rằng vấn đề trong hai câu hỏi này có liên quan (mặc dù một số tập hợp con của mã thực tế là giống nhau). Đó là lý do tôi đăng hai câu hỏi. – crockeea
Sử dụng các biến kiểu phạm vi để sửa loại đối số đầu tiên. Ngoài ra, hãy thử bao thanh toán 'forall' ra phạm vi toàn cục trong loại cho' runFun'. – nomen