Dieses Programm:Warum kompiliert dieses äquivalente Programm nicht?
{-# LANGUAGE RankNTypes, ImpredicativeTypes #-}
import qualified Data.Vector.Mutable as MV
import qualified Data.Vector as V
import Control.Monad.ST
import Control.Monad.Primitive
unsafeModify :: [(forall s . MV.MVector s Int -> ST s())] -> V.Vector Int -> V.Vector Int
unsafeModify mods vec = runST $ do
mvec <- V.unsafeThaw vec
(mods !! 0) mvec
V.unsafeFreeze mvec
Compiliert. Dieses Programm:
{-# LANGUAGE RankNTypes, ImpredicativeTypes #-}
import qualified Data.Vector.Mutable as MV
import qualified Data.Vector as V
import Control.Monad.ST
import Control.Monad.Primitive
unsafeModify :: [(forall s . MV.MVector s Int -> ST s())] -> V.Vector Int -> V.Vector Int
unsafeModify mods vec = runST $ do
mvec <- V.unsafeThaw vec
($ mvec) (mods !! 0)
V.unsafeFreeze mvec
lässt sich nicht kompilieren mit dem folgenden Fehler:
Muts.hs:10:15:
Couldn't match type ‘forall s1. UV.MVector s1 Int -> ST s1()’
with ‘UV.MVector s Int -> ST s a0’
Expected type: [UV.MVector s Int -> ST s a0]
Actual type: [forall s. UV.MVector s Int -> ST s()]
Relevant bindings include
mvec :: UV.MVector s Int (bound at Muts.hs:9:5)
In the first argument of ‘(!!)’, namely ‘mods’
In the first argument of ‘$ mvec’, namely ‘(mods !! 0)’
Warum?
Welchen Fehler gibt der zweite? –
Frage aktualisiert. Es tut uns leid. – MaiaVictor
Grundsätzlich aufgrund der "forall" Rank2Type in Ihrer Liste. '$' hat den (expliziten) Typ 'forall a b. (a -> b) -> a -> b ', und '(a -> b)' ist nicht kompatibel mit 'forall s. MV.Vector s Int -> St s() '. Siehe [diesen Artikel] (https://www.fpcomplete.com/school/to-infinity-and-beyond/pick-of-the-week/guide-to-ghc-extensions/explicit-forall#ranknypes--rank2types --und-polymorphe Komponenten) für einen schnellen Überblick über RankNTypes. – Zeta