这是我在看完之后尝试了解单子函数的尝试。
h
用于将两个任意函数和bind
组合在一起。在这种情况下,运营商是什么?f
g
unit
;; f :: int -> [str]
;; g :: str -> [keyword]
;; bind :: [str] -> (str -> [keyword]) -> [keyword]
;; h :: int -> [keyword]
(defn f [v]
(map str (range v)))
(defn g [s]
(map keyword (repeat 4 s)))
(defn bind [l f]
(flatten
(map f l)))
(f 8) ;; :: (0 1 2 3 4 5 6 7)
(g "s") ;; :: (:s :s :s :s)
(defn h [v]
(bind (f v) g))
(h 9)
;; :: (:0 :0 :0 :0 :1 :1 :1 :1 :2 :2 :2 :2 :3 :3 :3 :3 :4 :4 :4 :4 :5 :5 :5 :5)
啊,谢谢你的评论;我知道我在哪里感到困惑。
我熟悉这些函数以及如何使用 bind 组合它们:
f0 :: a -> M a
g0 :: a -> M a
但不具备这些功能:
f1 :: a -> M b
g1 :: b -> M c
但本质上,bind
如果相同,则两种情况下的运算符都是M
相同的。就我而言,M
是 list monad sof1
并且g1
可以像f0
and一样组合g0
。