On this page:
3.7.1 Monad定义
gen:  Monad
monad:  bind
Monad?
3.7.2 Monad操作
>>=
=<<
>>
<<
3.7.3 Monad的do记法
monad/  do
8.12

3.7 Monad(单子)🔗

3.7.1 Monad定义🔗

接口

gen:Monad

Monad接口。

最小实现monad:bind

procedure

(monad:bind f ma)  Monad?

  f : (-> a Monad?)
  ma : Monad?
>>=

procedure

(Monad? a)  boolean?

  a : any/c
是否gen:Monad实例。

3.7.2 Monad操作🔗

procedure

(>>= f ma)  Monad?

  f : (-> a Monad?)
  ma : Monad?
(=<< ma f)  Monad?
  ma : Monad?
  f : (-> a Monad?)

Examples:
> (>>= (list 1 2 3) list)

'(1 2 3)

> (>> (list 1 2 3) (list 10 20))

'(10 20 10 20 10 20)

> (=<< (lambda (x) (list x x x))  (list 11 12 13 14))

'(11 11 11 12 12 12 13 13 13 14 14 14)

procedure

(>> ma mb)  Monad?

  ma : Monad?
  mb : Monad?
(<< mb ma)  Monad?
  mb : Monad?
  ma : Monad?

Examples:
> (<< (list 1 2) (list 11 12 13 14))

'(1 2 1 2 1 2 1 2)

> (>> (list 1 2) (list 11 12 13 14))

'(11 12 13 14 11 12 13 14)

3.7.3 Monad的do记法🔗

syntax

(monad/do 表达式 ...+)

 
表达式 = 普通表达式
  | 赋值表达式
  | 中断表达式
  | 副作用表达式
     
赋值表达式 = 
  | (let id = expr)
  | (id <- expr)
     
中断表达式 = 
  | (break 任意值)
     
副作用表达式 = 
  | (! 表达式 ...+)

Examples:
> (monad/do
    (n <- (list 1 2))
    (list n n))

'(1 1 2 2)

> (monad/do
    (n <- (list 1 2))
    (! (when (= n 2) (break (list 20 20))))
    (list n n))

'(20 20)