5

私は慣用的な方法を探しています

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]か?

4

3 に答える 3

10

worldとのタイプが同じである限り、これを行うことができますmoveCreature (fromJust c) worldmaybeからご利用いただけますData.Maybe

 moveMaybeCreature = maybe id moveCreature

パターンマッチを行う最初の方法も問題なく機能するはずです。

于 2012-10-26T04:27:14.527 に答える
6

この機能を使用することをお勧めしmaybeます。この一般的な経験則 (あなたのためだけでなく、それを読んでいる初心者のための) のために、あなたがこの質問をするのは正しかった: のような型を持つ関数Maybe Foo -> BarMaybe Foo -> Maybe Bar、直接定義されている関数は、Haskellではコードのにおいがする。Maybe Foo引数として取る関数を書きたいと思うことはほとんどありません。だけを取る関数が必要でFoo、高階関数を使用して に適応させMaybe Fooます。

関数 があるとしますf' :: Maybe Foo -> Maybe Bar。これは通常、次のいずれかにリファクタリングできます。

  1. f :: Foo -> Barそしてfmap f :: Maybe Foo -> Maybe Bar;
  2. f :: Foo -> Maybe Bar(>>=f) :: Maybe Foo -> Maybe Bar

これは のFunctorインスタンスであるため、最初のケースが機能しMaybeます。

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

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

2 番目のケースは、次のMonadインスタンスであるため機能しMaybeます。

instance Monad Maybe where
    return = Just
    Nothing >>= f = Nothing
    (Just x) >>= f = f x

-- or this:
--     mx >>= f = maybe Nothing f mx
于 2012-10-26T04:55:19.067 に答える
3

元のコードに近い別のオプションを次に示します。

import qualified Data.Foldable as F

moveMaybeCreature = flip (F.foldr moveCreature)
于 2012-10-26T08:32:32.113 に答える