我已經閱讀了這篇文章的一些替代方案的含義(很長)
是什么讓我看到那篇文章是Alternative在一般情況下學習。這篇文章很好地回答了為什么它是這樣實作的List。
我的問題是:
- 為什么要
Alternative實施List呢?
也許有一種演算法可以使用Alternative并且 aList可能會傳遞給它,因此定義它以保持通用性?
我認為因為Alternative默認情況下定義someand many,這可能是它的一部分,但是What are some and many有用的包含評論:
澄清一下some,many對于最基本的型別,例如[]and Maybejust loop 的定義。因此,盡管someand manyfor them的定義是有效的,但它沒有任何意義。
在上面的“一些和許多有用的”鏈接中,Will 給出了 OP 的答案,其中可能包含我的問題的答案,但在我的 Haskelling 中,森林有點厚,看不到樹木。
謝謝
uj5u.com熱心網友回復:
Haskell 庫生態中有一些約定,如果一個事物可以是類的實體,那么它應該是類的實體。我懷疑誠實的回答到:“為什么是[]一個Alternative?” 是“因為它可以”。
...好吧,但為什么會存在這個約定?簡短的回答是,實體是 Haskell 的一部分,它只屈服于整個程式分析。它們是全域的,如果程式的兩個部分都嘗試進行特定的類/型別配對,則該沖突會阻止程式正常作業。為了解決這個問題,有一條經驗法則是,您撰寫的任何實體都應該與其關聯的類或關聯的型別位于同一模塊中。
由于實體應該存在于特定的模塊中,因此盡可能地定義這些實體是有禮貌的——因為另一個庫試圖解決您沒有提供實體的事實是不合理的。
uj5u.com熱心網友回復:
[]當作為非確定性單子查看時,Alternative 很有用。在這種情況下,<|>代表兩個程式之間的選擇,并empty代表“無有效選擇”。這與例如決議器的解釋相同。
some并且many對于串列確實沒有意義,因為它們嘗試從給定選項的所有可能的元素串列中貪婪地迭代,從第一個選項的無限串列開始。串列 monad 還不夠懶惰,無法做到這一點,因為如果給它一個空串列,它可能總是需要中止。然而,有一種情況兩者都終止:當給定一個空串列時。
Prelude Control.Applicative> many []
[[]]
Prelude Control.Applicative> some []
[]
如果some和many被定義為惰性(在正則運算式的意義上),這意味著他們更喜歡短串列,你會得到結果,但不是很有用,因為它首先使用第一個選項生成所有無限數量的串列:
Prelude Control.Applicative> some' v = liftA2 (:) v (many' v); many' v = pure [] <|> some' v
Prelude Control.Applicative> take 100 . show $ (some' [1,2])
"[[1],[1,1],[1,1,1],[1,1,1,1],[1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1],[1,1,1,1,1,"
編輯:我相信someandmany函式對應于star-semiringwhile<|>并且empty對應于半環中的加號和零。所以在數學上(我認為),將這些操作拆分成一個單獨的型別類是有意義的,但這也有點愚蠢,因為它們可以根據Alternative.
uj5u.com熱心網友回復:
考慮這樣的函式:
fallback :: Alternative f => a -> (a -> f b) -> (a -> f e) -> f (Either e b)
fallback x f g = (Right <$> f x) <|> (Left <$> g x)
意義不大,但你可以想象它被用在決議器中:嘗試一件事,如果那行不通就回退到另一件事。
這個函式什么時候有意義f ~ []?當然,為什么不呢。如果您認為串列的“效果”是在某個空間中進行搜索,那么此功能似乎代表了某種有偏見的選擇,在這種情況下,您更喜歡第一個選項而不是第二個選項,盡管您愿意嘗試其中任何一個,但您也標記你走了哪條路。
像這樣的函式是否可以成為某些演算法的一部分,該演算法在它計算的替代方案中是多型的?我再次不明白為什么不。[]擁有一個 Alternative 實體似乎并不是沒有道理,因為有一個滿足 Alternative 定律的實作。
至于你指出的 Will Ness 鏈接的答案:它涵蓋了這一點,some而many 不是“只是回圈”串列。它們回圈獲取非空串列。對于空串列,它們會立即回傳一個值。這有多大用處?可能不是很多,我必須承認。但是該功能與(<|>)和一起提供empty,這很有用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387025.html
下一篇:不能將等式約束表示為自定義約束
