Haskell:类系统扩展建议

我正在解决一些关于在Haskell中生成祖先实例的方法。 最近我在Haskell wiki上发现了这个:Class系统扩展建议。 所以,我想知道,这个提案有没有解决方案?

以下是建议中的例子:

Haskell中的当前类系统基于这样的想法:通过使用类或其祖先的其他方法,您可以在定义类的同时为类方法提供默认实现。 但是请考虑以下层次结构,这些层次结构是根据Functor层次结构提案和The Other Prelude调整的

class Functor m where
    fmap :: (a -> b) -> m a -> m b

class Functor m => Applicative m where
    return :: a -> m a

    apply :: m (a -> b) -> m a -> m b

    (>>) :: m a -> m b -> m b
    ma >> mb = (fmap (const id) ma) `apply` mb

class Applicative m => Monad m where
    (>>=) :: m a -> (a -> m b) -> m b

对于Monad的所有具体实例,我们可以用return和(>> =)来定义fmap,apply和(>>),如下所示:

fmap f ma = ma >>= (a -> return (f a))

apply mf ma = mf >>= f -> ma >>= a -> return (f a)

ma >> mb = ma >>= _ -> mb

换句话说,我们希望能够写出:

class Applicative m => Monad m where
    (>>=) :: m a -> (a -> m b) -> m b

    fmap f ma = ma >>= (a -> return (f a))

    apply mf ma = mf >>= f -> ma >>= a -> return (f a)

    ma >> mb = ma >>= _ -> mb

并且能够通过提供返回和(>> =)提供定义来定义Monad的新实例:

instance Monad T where
    ma >>= a_mb = ... -- some definition

    return a = ... -- some definition

显式导入/导出实例

这是必需的,这样可以构建大型程序而不用担心在不同软件包之间冲突实例声明。 可能的语法可能是:

module M
     -- exported instances 
   ( instance Monad T
   , instance Functor (F a) hiding (Functor (F Int), Functor (F Char))
   , F(..)
   ) where

import Foo (instance Monad a hiding Monad Maybe)

data T a
data F a b

上下文被省略,因为这不在实例选择中使用(此刻)。 import指令告诉编译器使用除了Monad Maybe实例以外的所有由Foo导出的Monad实例(Foo实际上是否导出Monad Maybe实例并不重要 - 这里所有重要的是我们不需要它如果有的话)。


是的, DefaultSignatures扩展允许这样做。 例如,对于Functor / Applicative例子,可以写

{-# LANGUAGE DefaultSignatures #-}
class Functor f where
    fmap :: (a -> b) -> f a -> f b
    default fmap :: Applicative f => (a -> b) -> f a -> f b
    fmap = liftA
链接地址: http://www.djcxy.com/p/43335.html

上一篇: Haskell: class system extension proposal

下一篇: Why doesn't Haskell have a stronger alternative to Eq?