首页 文章

Haskell类型类

提问于
浏览
8

我有一个Haskell类型类问题 . 我不能通过语法来获得这个(看似合理的)程序来在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"

我收到以下错误消息,哪种有意义,但我不知道如何解决它:

`[]' is not applied to enough type arguments
Expected kind `*', but `[]' has kind `* -> *'
In the type `MVar []'
In the instance declaration for `Blah (MVar [])'

2 回答

  • 2

    你想要的不是直接表达的 . 这可能就像你得到的那样接近:

    newtype MVarList a = MVarList (MVar [a])
    instance Blah MVarList where
        blah = fmap MVarList . newMVar
    
  • 12

    我正在阅读关于Conal Elliott的TypeCompose图书馆的文章,并提醒了这个问题 . 这是一个如何进行类型级组合的示例 .

    {-# LANGUAGE TypeOperators #-}
    {-# LANGUAGE FlexibleInstances #-}
    {-# LANGUAGE TypeSynonymInstances #-}
    module Main where
    
    ...
    
    import Control.Compose
    
    ...
    
    instance Blah (MVar `O` []) where
      blah = liftM O . blah2
    
    ...
    

相关问题