【问题标题】:Do monads have fluent interfaces?monad 有流畅的接口吗?
【发布时间】:2011-03-25 21:32:31
【问题描述】:

如果这个问题看起来很愚蠢,请原谅我,但我对函数式编程的整个世界还是很陌生,所以我需要一些 StackOverflow 上的居民来让我明白。

据我所知,对 monad 的操作会返回一个 monad。这是否意味着 monad 有一个流畅的接口,因此应用于 monad 的每个函数在对它包装的变量应用一些操作后返回该 monad?

【问题讨论】:

  • 我不认为这是一个有意义的问题——我认为,流畅的接口足以将其与 monad 进行比较(至少在 Haskell 中,monad 是一种“类型”) class”,与 OO 类非常不同)并不是特别有用。 (但我可能是错的。)
  • 是的,我不知道怎么问这个问题,因为我一直是一个面向对象的程序员。对不起,如果我没有任何意义。
  • 这个问题有道理,但我不确定它是否有一个好的答案。但是我没有做足够多的 OO 编程来给你一个有用的答案。
  • @AntalSpector-Zabusky 如果将 monad 概念扩展到 OOP,这是有道理的。特别是,像 Promises 这样的概念非常“单子”,some people 使用了 JQuery 包装器作为单子的示例。通常这些也有流畅的界面。

标签: functional-programming monads fluent-interface


【解决方案1】:

大概您指的是与 monad 相关的 bind 运算符,其中可以从 monadic 值开始,将其绑定到 monadic 函数 em>,并以另一个 monadic 值结束。这很像一个返回“this”指针或引用的“流利方法”(或一组这样的“流利接口”),是的,但是你会错过的是单子函数需要返回一个与输入值相同类型的一元值。流畅的方法约定是返回相同类型的值,以便继续链接在正在准备的实例(或多个实例)上有效的所有调用。

一元 bind 操作符签名看起来更像这样:

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

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

(a -> M[a])

这完全取决于一元函数的类型,更具体地说,取决于一元函数的返回类型。

如果你要将你接受的单子函数的域限制为返回与提供给 bind 运算符的单子值相同类型的函数,那么是的,你会有一些东西它的行为就像一个流畅的界面。

【讨论】:

  • 虽然你已经弄清楚了 monad 的确切行为方式,但看起来我仍然需要做更多的研究!谢谢并接受。
【解决方案2】:

根据我对 fluent 接口的了解,它们主要是关于通过使用方法链接使代码“很好读”。比如:

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

它的 Haskell do-notation 版本(使用虚构的日期 api)可能如下所示:

do date
   withYear 2008
   withMonth JANUARY
   withDayOfMonth 15
   toDate

这个或其他基于 do-notation 的 DSL 是否符合“流畅接口”的条件可能还有待讨论,因为没有关于“流畅接口”的正式定义。我会说如果它读起来像这样,那么它就足够接近了。

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

【讨论】:

  • 你实际上不需要最后的“toDate”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 2014-09-07
  • 2021-04-30
  • 1970-01-01
  • 2014-12-05
相关资源
最近更新 更多