[英]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
,它選擇f
為IO
,並顯示結果列表[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.