1

これは、これを見た後にモナド関数を理解する私の試みです。

hを使用bindして、2 つの任意の関数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)

コメントありがとうございます。迷っていたところが見えてきました。

私はこれらの関数とバインドを使用してそれらを構成する方法に精通していました。

f0 :: a -> M a
g0 :: a -> M a

ただし、これらの関数ではありません:

f1 :: a -> M b
g1 :: b -> M c

しかし、基本的にbindは、 が同じであれば、どちらの場合でも演算子はM同じです。私の場合、Mリストモナドはそうf1であり、と同じようにg1組み合わせることができます。f0g0

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 に答える