monad是否具有流畅的界面?

时间:2011-03-25 21:32:31

标签: functional-programming monads fluent-interface

请原谅我,如果这个问题看起来很愚蠢,但我对整个函数式编程世界都很陌生,所以我需要在StackOverflow上使用一些居民来让我直截了当。

从我收集的内容来看,对monad的操作会返回monad。这是否意味着monad具有流畅的接口,其中应用于monad的每个函数在将一些操作应用于它包装的变量之后返回该monad?

2 个答案:

答案 0 :(得分:7)

大概你指的是与monad相关联的 bind 运算符,其中一个可以以 monadic值开头,将它绑定到 monadic函数,并结束另一个 monadic值。这很像一个“流畅的方法”(或一组这样构成一个“流畅的界面”),它返回一个“this”指针或引用,是的,但你在那里错过的是monadic函数需要返回与输入值类型相同的monadic值。流畅的方法约定是返回相同类型的值,以便继续链接对正在准备的实例(或实例)上 all 有效的调用。

monadic bind 运算符签名看起来更像是这样:

M[a] -> (a -> M[b]) -> M[b]

也就是说,“返回值”是可能的类型与第一个输入值的类型不同。当提供的函数具有类型

时,它只是相同的
(a -> M[a])

这一切都取决于monadic函数的类型 - 更具体地说,取决于monadic函数的返回类型。

如果要约束monadic函数的域,你接受那些返回与提供给 bind 运算符的monadic值相同类型的函数,那么是的,你有一些东西表现得像一个流畅的界面。

答案 1 :(得分:1)

基于我对流畅接口的了解,他们主要是通过使用方法链来使代码“很好地读取”。例如:

Date date = date()
    .withYear(2008)
    .withMonth(Calendar.JANUARY)
    .withDayOfMonth(15)
    .toDate();

它的Haskell do-notation版本(使用虚构的日期api)可能看起来像:

do date
   withYear 2008
   withMonth JANUARY
   withDayOfMonth 15
   toDate

这个或其他基于符号的DSL这样的资格是否符合“流畅的界面”可能需要讨论,因为没有关于“流畅的界面”的正式定义。我会说如果它读起来那么它就足够了。

请注意,这并不是monad特有的;如果您不需要方法调用,则monads可以使用流畅的接口,但这取决于函数名称和API的使用方式。