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个回答

12

您想表达的内容并不是直接可表达的。以下翻译可能是最贴近您所需的:

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

1
对于函数来说,存在 (.) :: (b -> c) -> (a -> b) -> a -> c,但是对于 rank-1(或 rank-n)类型没有这样的组合。 - ephemient
1
是的,我得出了同样的结论。因此,Haskell的类型系统比其类型语法更具表现力!很奇怪。 - Geoff
1
这不仅仅是语法问题 - Haskell根本不支持类型级别的lambda表达式。显然,这是因为它使类型推断期间的统一变得不可能。参见:http://www.mail-archive.com/haskell-cafe@haskell.org/msg20984.html(顺便说一句,在该页面上提到的UHC / EHC在Haskell语法中也不支持类型级别的lambda表达式) - Tom Lokhorst
3
您可以使用Conal Elliot的TypeCompose软件包:http://hackage.haskell.org/cgi-bin/hackage-scripts/package/TypeCompose。这将允许您编写`instance Blah (O MVar [])`,其中O是类型级别组合。 - Alexey Romanov
对于 alpha-, beta- 和 eta- 变换的一致化(“高阶一致化”),是半可决定的,这在 Haskell 类型推断和实例选择中通常非常有用。回溯也是如此。 某种程度上,我们当前用于实例选择的理论和机制令人想起高阶逻辑编程(HOLP),包括全称量词和存在量词(如 Lambda Prolog),但仍然存在缺陷。 我想知道是否可以使用完整的 HOLP 或类似的东西。 会出现一些棘手的问题,我不知道它们是否已得到积极追求。 - Conal
显示剩余3条评论

2

我正在阅读Conal Elliott的TypeCompose库,并想起了这个问题。下面是一个例子,展示如何进行类型级别的组合。

{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
module Main where

...

import Control.Compose

...

instance Blah (MVar `O` []) where
  blah = liftM O . blah2

...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接