当我使用fmap一个值时,它基本上"取消装箱"该值,将函数应用于它,并将其备份.
例如:
-- returns Just 8
fmap (+3) (Just 5)
Run Code Online (Sandbox Code Playgroud)
有没有任何功能可以给我带来价值而无需重新装箱?
-- returns 8
fmap_2 (+3) (Just 5)
Run Code Online (Sandbox Code Playgroud)
当然,我不知道这对于数组是如何工作的,但对于初学者来说,它对Eithers和Maybes 很有用.我也可以用它轻松混合Monads:
-- myfunc :: Maybe Int
-- if myfunc returned a Just, show it and then print it. Otherwise, print 'Nothing'.
putStrLn . fmap show $ myfunc
Run Code Online (Sandbox Code Playgroud)
或者还有另一种混合Monads的标准方法吗?
用于提取Maybe用途maybe:
maybe 0 (+3) $ Just 5
>>> 8
maybe 0 (+3) Nothing
>>> 0
Run Code Online (Sandbox Code Playgroud)
fromJust只有在Nothing必须将其视为异常情况时才应使用.如果没有充分的理由,不要养成破坏程序的习惯.该Maybe和Either在那里正是帮助你避免这种情况.
因为Either有一个功能either:
either (*2) (+2) $ Left 3
>>> 6
either (*2) (+2) $ Right 3
>>> 5
Run Code Online (Sandbox Code Playgroud)
请注意,在正确的代码中,您不需要经常提取monad.这有点关于他们,Haskell必须提供使用monadic值所需的所有工具,就像它们被提取一样.
所有仿函数都不能存在此函数.即使对于简单的Maybe,如果你有一个Nothing.因为IO,这将允许您在程序中执行任意IO并且明显不安全.最后,对于一些稍微怪异的仿函数(就像(->) e它只是一个带有类型参数的函数e),这甚至没有任何意义.
但是,对于某些类型的仿函数,此函数存在.例如,有一个名为fromJust具有类型的函数Maybe a -> a.但是,如果传递此函数a Nothing,则会出现运行时错误.
因此,对于某些也是实例的类型,可能存在这样的函数Functor,但它对Functor类本身没有意义.
| 归档时间: |
|
| 查看次数: |
2075 次 |
| 最近记录: |