繁体   English   中英

仅在isJust时应用函数

[英]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相同,你就可以做到这一点。 您可以使用maybeData.Maybe

 moveMaybeCreature = maybe id moveCreature

你模式匹配的第一种方式应该也可以正常工作。

我推荐使用maybe函数。 你提出这个问题是正确的,因为这个一般的经验法则(不仅适合你,而且适合任何新人阅读):类似Maybe Foo -> BarMaybe Foo -> Maybe Bar的函数是直接定义的Haskell中的代码味道 你几乎从不想写一个以Maybe Foo为参数的函数; 你想要一个只需要Foo的函数,并使用一个更高阶的函数来使它适应Maybe Foo

假设你有一个函数f' :: Maybe Foo -> Maybe Bar 这通常可以重构为:

  1. f :: Foo -> Barfmap f :: Maybe Foo -> Maybe Bar ;
  2. f :: Foo -> Maybe Bar(>>=f) :: Maybe Foo -> Maybe Bar

第一种情况有效,因为这是MaybeFunctor实例:

instance Functor Maybe where
    fmap f Nothing = Nothing
    fmap f (Just x) = Just (f x)

-- or this:
--     fmap f = maybe Nothing (Just . f)

第二种情况有效,因为这是MaybeMonad实例:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM