Monad 具有以下組件。
- a和ma由 Functor從a轉換而來
- a -> mb箭頭和將mm更改為m的方法
- 箭頭的組成
如果有一個結構無論組成如何都具有 1,2,我可以說它是 Monadic 嗎?
當然,如果一個結構有 1 和 2,它可以組成。但它不必擔心嗎?
編輯:
我認為關聯性,身份是關于組合的。如果一個結構完全正確,它只是一個 Monad。我的問題是關于“Monadic”的。Monad 最重要的因素是 mu(join),所以如果一個結構只有 mu,它大概是 Monadic 的東西嗎?
或 Monadic 只是 Monad 的形容詞。
“Monadic”的意思是它是 Monad 的一個因素。Monad 的
Monadic 結構
Monadic 型別ma Monad,
Monadic 箭頭a -> Monad 的 mb,
Monadic compostion >=> Monad
...
uj5u.com熱心網友回復:
這看起來像兩個問題:一個關于術語的問題,以及一個關于單子定律是否僅與“組成”相關的問題。
對于術語問題...
正如@cstml 在評論中指出的那樣,在范疇論中有一個“monadic functor”的正式定義,但我認為 Haskell 程式員通常不會在這種正式意義上使用“monadic”,而且它看起來不像你'正在詢問那個。
當我使用術語“monadic”時,我通常將它用于“與 monad 有關的事物”的意義上。所以單子動作是 a 形式的表達,m a當Monad m我從事單子編程時,我使用的是單子。
我通常不會在“類似單子”的意義上使用它,但我可以看到可能會說“箭頭有一些單子行為,但它們不一定是單子”。另一方面,如果你說“type Xis monadic”沒有限定,這聽起來只是一種不尋常的說法,即“type Xis a monad”。
對于單子定律問題...
盡管 Haskell 的 monad 定律通常用 和 來表達return,但一組僅涉及、和>>=的替代定律可以被制定。也就是說,算子本身完全滿足恒等律和結合律,這些律或多或少等同于 滿足的律。returnfmapjoinjoin>>=
具體來說,任何單子都遵循明顯的規律:
fmap f . return = return . f
join . fmap return = id
join . return = id
如果您有一個支持操作的物件:
return :: a -> m a -- convert from `a` by functor
join :: m (m a) -> m a -- change `m m` to `m`
但不滿足任何這些法律,那么它看起來不是很“單子”。
如果它確實滿足上述定律,則組合定義為:
x >>= f = join (fmap f x)
將自動滿足通常的 Haskell 左右恒等律:
return a >>= k = k a
m >>= return = m
因此,這些法律不僅僅是“關于構圖”。
上面沒有暗示的唯一通常的 Haskell 定律是關聯性。像其他人一樣,它可以用 and 來表示,join而fmap不是>>=它采用以下形式:
join . fmap h . join . fmap k = join . fmap (join . fmap h . k)
Basically, the question of associativity can either be expressed as the associativity of the composition of monad arrows or as the associativity of the join operation acting on the type m m m a -- in other words, does it matter if you join the outer layer first or the inner layer first?
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/452947.html
上一篇:空約束有什么用?
