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 [])'
Était-ce utile?

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
scroll top