我正在尋找重復字串n時間的解決方案。我duplicate n str = [1..n] >> str從這個解決方案中找到了。我想知道為什么這種方法會重復str.
我搜索了一下>>,發現了以下幾點:
k >> f = k >>= \_ -> f
和
a >> b >> c >> d
-- is is equivalent to
do a
b
c
d
然后我試試這個
ghci> do [1..3]; "a"
"aaa"
但我仍然不明白它是如何作業的。誰能解釋這種行為?
uj5u.com熱心網友回復:
>>=for 串列的定義是concatMap:對串列的每個元素應用一個函式,然后將結果連接起來。當你使用 時>>,這意味著應用一個忽略串列中每個元素的函式,而是回傳右側的常量值>>
[1..3] >> "a" == [1..3] >>= \_ -> "a"
== concatMap (\_ -> "a") [1..3]
== "a" "a" "a"
== "aaa"
uj5u.com熱心網友回復:
根據單子定律,
a >> b >> c >> d
-- is equivalent to
-- (values) (computations)
do a do { a do { _x <- a
b ; b ; _y <- b
c ; c ; _z <- c
d ; r <- d ; r <- d
; return r ; return r
} }
并用 Monad Comprehensions 撰寫它 - 對于串列,非巧合的是,它與 List Comprehensions 完全相同 - 它變成
[ r | _x <- a, _y <- b, _z <- c, r <- d ]
這意味著,在偽代碼中,
for each _x in a: for each _x in a:
for each _y in b: for each _y in b:
for each _z in c: for each _z in c:
for each r in d: do d
do yield r
所以我們只是“做”同樣的事情,一遍又一遍,以嵌套的方式為上面的動作結果的d每個組合。
對于串列,這意味著將 的元素d重復拼接到結果串列中。
在某種意義上,廣義(嵌套)回圈就是(monads)/applicative/functors ,描述了從最深層次產生最終結果的組合計算:(*)
Functor Applicative Monad
for x in a: for x in a for x in a:
do yield (foo x) and y in b: for y in (bar x):
do yield (foo x y) do yield (foo x y)
"loop" "loops" "nested loops"
(created on the fly)
(*)無論有多少層,從整體上看,“回圈”組合都會一個接一個地產生結果,就像每個“回圈”在分離中一個接一個地產生它的列舉一樣。它是如此微不足道,我們甚至不會在命令式回圈中注意到它。
每種特定型別的 Functor 賦予上面的“for”、“in”和“do yield”其含義。對于串列,這意味著拼接結果,使用concat/實作concatMap。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/417806.html
標籤:
上一篇:如何使用單詞串列分隔字串?
下一篇:丟棄(>>)翻轉的一元組合
