可以为.NET编写函子接口吗?

可以为.NET编写函子接口吗?,.net,functional-programming,.net,Functional Programming,函数式语言通常具有类型/接口 在.NET中,Functor接口是一个可由泛型类型(T)实现的接口,该接口具有一个名为fmap的函数,该函数将一个函数从容器类型(a)转换为另一种类型(B),并返回一个容器类型为B的对象 例如,类型List将具有方法List.fmap。签名将类似于: public List<B> fmap<B>(Func<A,B>); 公共列表fmap(Func); 有可能创建这样的接口吗?有可能做类似的事情吗?是否有任何包提供这样的接口并为

函数式语言通常具有类型/接口

在.NET中,Functor接口是一个可由泛型类型(
T
)实现的接口,该接口具有一个名为fmap的函数,该函数将一个函数从容器类型(
a
)转换为另一种类型(
B
),并返回一个容器类型为B的对象

例如,类型
List
将具有方法List.fmap。签名将类似于:

public List<B> fmap<B>(Func<A,B>);
公共列表fmap(Func);
有可能创建这样的接口吗?有可能做类似的事情吗?是否有任何包提供这样的接口并为明显的类提供扩展方法(
List
Dictionary
Set
,等等)

更新


我知道IEnumerable对象几乎可以做到这一点。关键区别在于IEnumerable.Select返回的IEnumerable不是实现者的类型。例如,List.Select(A=>B)返回IEnumerable not List。这说明了为什么您不能以.NET的明显方式实现IMappable,但是您是否可以使用黑客或额外的类型信息来有效地实现它?

好的,根据评论,我怀疑答案是否定的-您需要更高阶的泛型类型。您可能需要以下内容:

// Not real syntax!
interface IFunctor<TFunctor<?>, TValue>
    where TFunctor<X> : IFunctor<TFunctor<X>, TValue>
{
    TFunctor<TProjection> Project<TProjection>(Func<TValue, TProjection> func);
}
//不是真正的语法!

接口IFunctor为
fmap
指定一个类型的困难在于它是由一个更高级的类型变量,容器类型参数化的。因此,除了作为一个简单的多态函数,比如列表上的
map:

map :: (a -> b) -> List a -> List b
fmap
将其概括为适用于任何容器以及任何元素类型:

fmap :: Functor (f :: * -> *) => (a -> b) -> f a -> f b

C#中的问题是
f
是一种更高级的类型变量(它是一种类型函数)。因为C#不支持更高的种类,所以直接写这篇文章会很不走运

对不起,我应该澄清一下。我知道IEnumerable对象几乎可以做到这一点。关键区别在于IEnumerable.Select返回的IEnumerable不是实现者的类型。例如,List.Select(A=>B)返回IEnumerable not List。这为我澄清了为什么不能用.NET的明显方式实现IMappable,但我想知道是否有一些黑客或额外的类型信息可以用来有效地实现。更新的问题反映了这一点,谢谢:)@John:你对学术感兴趣吗?这不像你能让
List
实现一个它还没有实现的接口。。。但是如果你对它的工作方式感兴趣,那可能是另一回事。@John:我已经编辑了我的答案-看看这对你是否更有用。我相信你可以使用扩展方法为现有类实现接口:@John:你实际上无法实现接口。你可以让它看起来你在添加方法,但是你不能让一个类型真正实现一个接口-如果你这样做
if(foo是IBar)
它仍然会返回false。扩展方法只是调用静态方法的C#语法糖。
map :: (a -> b) -> List a -> List b
fmap :: Functor (f :: * -> *) => (a -> b) -> f a -> f b