1

这是我在看完之后尝试了解单子函数的尝试。

h用于将两个任意函数和bind组合在一起。在这种情况下,运营商是什么?fgunit

;; 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可以像f0and一样组合g0

4

2 回答 2

1

这是一个列表单子,所以unit运算符是x ↦ [ x ],即

(defn return [x] [x])

return在同名和目的的 Haskell 函数之后调用。)

通过检查它是否满足单子定律可以看出这是单位运算符:

(bind (return a) f) => (bind [a] f) 
      => (flatten (map f [a])) => (flatten [f a]) => f a  ;; f returns a vector

同样对于(bind x return).

于 2012-09-10T17:27:06.807 回答
1

您是否正在尝试实现列表单子?如果是这样,那么它将是:

(defn unit [x]
  [x])

这是基于Haskell 实现

instance  Monad []  where
    m >>= k             = foldr ((++) . k) [] m
    return x            = [x]
于 2012-09-10T17:28:40.420 回答