![](/img/trans.png)
[英]Why can't I use 'isJust' in the lambda function in `foldr`?
[英]Apply a function only if isJust
我正在寻找一种惯用的方式
moveMaybeCreature Nothing world = world
moveMaybeCreature (Just creature) world = moveCreature creature world
或者换句话说
if isJust c
then doSomething (fromJust c) w
else w
我以为我可以这样做:
moveMaybeCreature c w = foldr moveCreature w (maybeToList c)
我可以在不必将Maybe Creature
转换为[Creature]
吗?
只要world
类型和moveCreature (fromJust c) world
相同,你就可以做到这一点。 您可以使用maybe
从Data.Maybe
。
moveMaybeCreature = maybe id moveCreature
你模式匹配的第一种方式应该也可以正常工作。
我推荐使用maybe
函数。 你提出这个问题是正确的,因为这个一般的经验法则(不仅适合你,而且适合任何新人阅读):类似Maybe Foo -> Bar
或Maybe Foo -> Maybe Bar
的函数是直接定义的Haskell中的代码味道 。 你几乎从不想写一个以Maybe Foo
为参数的函数; 你想要一个只需要Foo
的函数,并使用一个更高阶的函数来使它适应Maybe Foo
。
假设你有一个函数f' :: Maybe Foo -> Maybe Bar
。 这通常可以重构为:
f :: Foo -> Bar
和fmap f :: Maybe Foo -> Maybe Bar
; f :: Foo -> Maybe Bar
和(>>=f) :: Maybe Foo -> Maybe Bar
第一种情况有效,因为这是Maybe
的Functor
实例:
instance Functor Maybe where
fmap f Nothing = Nothing
fmap f (Just x) = Just (f x)
-- or this:
-- fmap f = maybe Nothing (Just . f)
第二种情况有效,因为这是Maybe
的Monad
实例:
instance Monad Maybe where
return = Just
Nothing >>= f = Nothing
(Just x) >>= f = f x
-- or this:
-- mx >>= f = maybe Nothing f mx
这是另一个选项,更接近原始代码:
import qualified Data.Foldable as F
moveMaybeCreature = flip (F.foldr moveCreature)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.