簡體   English   中英

Haskell Applicative []為什么我不能用函數中的[]替換pure []?

[英]Haskell Applicative [] why can I not replace pure[] with [] in function?

ghci> :t pure []
pure [] :: Applicative f => f [a]

ghci> pure []
[]

ghci> :t []
[] :: [a]

ghci> fmap ((:) 2) (pure [])
[2]

ghci> fmap ((:) 2) ([])
[]

fmap ((:) 2) (pure [])以為在fmap ((:) 2) (pure [])中用[]替換pure[]會導致相同的結果..誰可以解釋給我的區別?

pure的類型是Applicative f => a -> fa so pure []

具有類型Applicative f => f [a] 您可以為不同的應用類型明確指定f ,例如

pure [] :: Maybe [String]   //Just []
pure [] :: IO [String]      //displays '[]' in ghci
pure [] :: [[String]]       //[[]]

fmap ((:) 2) (pure [])(Applicative f, Num a) => f [a] 由於Ghci在IO monad中運行,這是一個Applicative ,它選擇fIO ,並顯示結果列表[2] ,這就是你所看到的。

您可以直接指定應用類型以查看不同的結果,例如

fmap ((:) 2) (pure []) :: (Maybe [Int])

Just [2]

fmap ((:) 2) ([]) ,輸入列表中沒有元素,因此您獲得一個空列表。

為什么一樣? 他們是不同的表達方式。

如果我們只看列表,它可能會簡化事情。 所以,有空列表[] 它的類型可以是圍繞它的括號,特別是嵌套列表:

前奏> [] :: [[Int]]
[]

但是還有另一個“空嵌套列表”:

前奏> [[]] :: [[Int]]
[[]]

這個並不是空的,它只包含空列表。 [[],[],[],...]也是可能的)。 事實上,如果在列表應用程序中完成,那將是您嘗試過的結果:

Prelude Control.Applicative> pure [] :: [[Int]]
[[]]

它肯定與空列表不一樣,

前奏> [[]] == []

特別是,

前奏>(長[],長[[]])
(0,1)

並且fmap對空列表進行操作永遠不會做任何事情,而對包含空的列表進行fmap ping將使用[]調用該函數:一種簡單的方法來查看這是

Prelude Control.Applicative> fmap undefined []
[]
Prelude Control.Applicative> fmap undefined [[]]
[ *例外:Prelude.undefined

關於你的試驗的真正令人困惑的事情是ghci默默使用IO monad。


對於實際的空虛,還有一個Applicative的子類:

Prelude Control.Applicative>:i Alternative
class Applicative f =>替代f其中
空:: fa
(<|>):: fa - > fa - > fa
some :: fa - > f [a]
很多:: fa - > f [a]
- 在`Control.Applicative'中定義
實例Alternative [] - 在`Control.Applicative'中定義
實例Alternative Maybe - 在`Control.Applicative'中定義

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM