对不起,如果这个问题看起来很愚蠢,但我对函数式编程的整个世界还很陌生,所以我需要一些 StackOverflow 社区的专家帮助我理解。
据我了解,对于一个单子(monad)的操作返回也是一个单子。这是否意味着单子有流畅接口(fluent interface),每个应用在单子上的函数,在将其封装的变量进行某些操作后,都会返回该单子?
对不起,如果这个问题看起来很愚蠢,但我对函数式编程的整个世界还很陌生,所以我需要一些 StackOverflow 社区的专家帮助我理解。
据我了解,对于一个单子(monad)的操作返回也是一个单子。这是否意味着单子有流畅接口(fluent interface),每个应用在单子上的函数,在将其封装的变量进行某些操作后,都会返回该单子?
M[a] -> (a -> M[b]) -> M[b]
也就是说,“返回值”可能与第一个输入值的类型不同。只有当提供的函数具有以下类型时,才相同:
(a -> M[a])
这完全取决于单子函数的类型,更具体地说,是单子函数的返回类型。
如果你将接受的单子函数的定义域限制为与提供给bind操作符的单子值相同的类型,则确实会得到类似流畅接口的行为。
根据我所知道的流畅接口,它们主要通过使用方法链使代码“可读性更好”。举个例子:
Date date = date()
.withYear(2008)
.withMonth(Calendar.JANUARY)
.withDayOfMonth(15)
.toDate();
使用Haskell do-notation版本(使用虚构的日期API),代码示例如下:
do date
withYear 2008
withMonth JANUARY
withDayOfMonth 15
toDate