luc*_*iet 10 .net c# monads functional-programming
public static Func<V> To<T, V>(this Func<T> g, Func<T, V> h)
{
return () => h(g());
}
public static Func<T> ToIdentity<T>(this T t)
{
return () => t;
}
Run Code Online (Sandbox Code Playgroud)
在延迟评估时,我有时会使用这些和其他人.这些已经在.net库中吗?
编辑:
以下是一个示例用法:
public static string SuffixColumn(this string v, string suffix, int columns)
{
return
v.ToIdentity()
.ToScrubbedHtml()
.ToFormat(() => "{0} " + suffix.ToLower().PadLeft(columns, ' '))
.ToErrorText(v, suffix, columns)();
}
Run Code Online (Sandbox Code Playgroud)
ToErrorText将'v'检查为合法(非错误代码,非null等),如果好,它运行链接在Func中,如果不好则生成故障安全文本结果.如果v,后缀或列不好,则永远不会调用ToFormat.(因此延迟/未评估的使用).
ToFormat几乎是提供的Func和string.Format的组合.ToIdentity用于将v提升为Func,然后链中的所有内容都基于T的一些Func.
Eri*_*ert 34
让我看看我是否理解:你正在使用lambdas来捕获"包装器"对象中的值Func<T>- 然后 - 然后围绕包装对象构建一个懒惰评估函数的工作流,是吗?

虽然用功能构建它,但我个人倾向于用一些自定义类型构建monad; 将monadic类型或其"底层"类型的函数与monad本身的实例混淆似乎太容易了.您基本上是使用函数构建标识monad ; 我更倾向于简单地创建一个具有名称的类或接口,该名称反映了您将标识monad放入的目的.
您也可以考虑重命名方法.您的"To"传统上称为"Bind",而您的"ToIdentity"传统上称为"Unit".
也就是说,monad类型的monad模式M<T>通常具有以下方法:
public static M<V> Bind<U, V>(this M<U> m, Func<U, M<V>> k)
Run Code Online (Sandbox Code Playgroud)
和
public static M<T> Unit<T>(this T value)
Run Code Online (Sandbox Code Playgroud)
bind允许你在monad上实现函数的组合,这些函数类似于组成monad的"底层"类型的函数.
为了温和地介绍C#中monad的奇迹,请看我以前的同事Wes Dyer关于这个主题的精彩文章:
http://blogs.msdn.com/b/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx
要回答您的实际问题:
这些已经在.net库中吗?
那些确切的功能不在框架中.但功能非常类似于框架中存在的功能.例如,SelectManyon IEnumerable<T>类似于您的To方法; 它实现了对序列的monadic绑定操作. new Nullable<int>(123)类似于你的"ToIdentity"方法; 它实现了"may monad"的monadic单元操作.等等.
CLR类型系统是不够丰富表达单子图案一般 ; 为此你需要一个"更高"的类型系统,就像Haskell一样.你必须自己构建每个特定的monad.但是,看起来你很顺利.
关于在C#类语言中使用monad的更多想法:
C#中的Monads - 为什么Bind实现需要传递函数来返回monad?
为什么在即将推出的.NET 4.0中没有类似IMonad <T>的东西
| 归档时间: |
|
| 查看次数: |
1083 次 |
| 最近记录: |