यहाँ का उपयोग कोड है:एक monadic रैंक -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
हालांकि, मुझे यकीन है कि ठीक करने या समस्या का निदान करने के लिए कैसे नहीं हूँ। यह एक अच्छी जगह (और अच्छी तरह से लिखित) प्रकार हस्ताक्षर के रूप में सरल हो सकता है।
यह पता लगाने की क्या चल रहा था की कोशिश में, मैं एक गैर monadic संस्करण (मेरे लिए बेकार) लिखते हैं, लेकिन यह संकलित:
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
पहले तर्क के प्रकार को ठीक करने के लिए स्कॉप्ड प्रकार चर का उपयोग करें। साथ ही, 'रनफन' के प्रकार में वैश्विक दायरे में 'फॉरल' को फैक्टर करने का प्रयास करें। – nomen