4

私は Haskell の初心者で、次の関数を表現力豊かに組み合わせる方法がわかりません。

f :: A -> B
g :: B -> Maybe C
h :: C -> Bool

私はこのような機能が欲しい:

y :: A -> Bool

現在、私はそのようにしています:

y a = case (fmap h ((g.f) a)) of {
            Just b -> b;
            Nothing -> False}

うーん、これは本当に醜いと思います (わかりました、名前は文字だけですが、実際のコードも醜いです)。私が欲しいのは、次のようなより表現力豊かな関数の連結です。

y a = (h.g.f) a `or` False

どうすればモナド関数とファンクターを組み合わせることができますか? ( Java 8orのように?)Optional#orElse

4

2 に答える 2

5

認識すべきことは、あなたは Nothing が偽物であると考えているということですが、Haskell はデフォルトでそれを想定していません: あなたはそれを伝える必要があります。

smash :: Maybe Bool -> Bool
smash Nothing = False
smash (Just v) = v

-- or
smash = maybe False id

次に、スマッシングと一緒に操作を連鎖させることができます

it :: A -> Bool
it = smash . fmap h . g . f

編集: 明確にするために、これはまさにあなたのコードです。

于 2014-08-12T15:28:42.893 に答える