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