Question
J'ai la question d'un Haskell. Je ne peux pas munge la syntaxe pour obtenir ce programme (apparemment raisonnable) de compiler sous GHC.
import Control.Concurrent.MVar
blah1 :: [a] -> IO ([a])
blah1 = return
blah2 :: [a] -> IO (MVar [a])
blah2 = newMVar
class Blah b where
blah :: [a] -> IO (b a)
instance Blah [] where
blah = blah1
-- BOOM
instance Blah (MVar []) where
blah = blah2
main :: IO ()
main = do
putStrLn "Ok"
Je reçois le message d'erreur suivant, ce qui fait genre de sens, mais je ne sais pas comment le résoudre:
`[]' is not applied to enough type arguments
Expected kind `*', but `[]' has kind `* -> *'
In the type `MVar []'
In the instance declaration for `Blah (MVar [])'
La solution
Qu'est-ce que vous voulez est pas directement exprimable. Ceci est probablement aussi proche que vous obtenez:
newtype MVarList a = MVarList (MVar [a])
instance Blah MVarList where
blah = fmap MVarList . newMVar
Autres conseils
Je lisais sur le TypeCompose , et a été rappelé cette question. Voici un exemple de la façon dont vous pouvez faire composition niveau du type.
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
module Main where
...
import Control.Compose
...
instance Blah (MVar `O` []) where
blah = liftM O . blah2
...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow