2015-01-21 22 views
3

給定一組[1,2,3],功率集是唯一的。我們爲什麼說它是非確定性的?考慮另一個例子爲什麼功率集在haskell中被認爲是非確定性的例子?

[1,2] >>= \n -> ['a','b'] >>= \ch -> return (n,ch) 

爲什麼這個函數是非確定性的?

如果我認爲\ch -> return (n,ch)作爲第一個功能的第二個功能?

而且如果第一個功能是

\n -> ['a','b'] >>= \ch -> return (n,ch) 

爲什麼是從右到左的評價。

是不是應該是\n -> (function)

這是什麼功能(['a','b'] >>= \ch -> return (n,ch))

如果從左到右它不能使用第一部分['a','b']而不是第二個\ch函數,它不需要對參數'n'做任何事情。

+0

列表沒有設置,我懷疑這是造成混亂的原因。 Powerset本身是完全確定性的,列表操作也是確定性的,但由於列表和集合之間沒有1:1的對應關係,列表中的「powerset」實現並沒有很好地規定。 – leftaroundabout 2015-01-21 12:02:51

+9

誰說這是非確定性的?我問,因爲他們錯了,或者你誤解了他們的意圖。我們通常說單子monad允許我們爲非確定性建模 - 這並不意味着我們的計算結果始終是非確定性的 - 完全相反。列表允許我們確定性地對非確定性建模。通過用可能值列表表示單個值並將其視爲單個值的類型,我們可以假設我們正在處理單個值,而事實上我們正在處理所有可能的值組合。 – kqr 2015-01-21 12:19:41

回答

12

爲什麼在討論列表monad時有時使用術語非確定性的原因是由於指稱語義。在給非確定性語言賦予語義時,通常使用電源域。這個域可以使用列表在Haskell中近似。由於在Haskell中使用monad來源於它們在指稱語義中的使用,所以在該領域中使用的一些術語即使在它們的新上下文中可能有意義也可能沒有意義。

相關問題