5

私のコードには次の構成があります。

f :: Maybe A -> X
f a = case a of
  Nothing -> x
  (Just b) -> case b of
    Nothing -> y
    (Just c) -> case c of
      Nothing -> z
      (Just d) -> d

maybeネストされた関数を使用する代わりに、これを単純化する明白な方法は見当たりません。この構成をより「エレガント」にするのに役立つ巧妙な、しかし理解可能なトリックはありますか?

4

3 に答える 3

12

Maybe (Maybe (Maybe X))そもそもなぜコードが値を構築したのでしょうか? そのような値をアンパックするのは良くありませんが、本当の問題は、なぜそのような値があるのか​​ということです。おそらく、コードは入れ子になったすべての Maybe を避ける方がよいでしょう。

そのような値が本当に必要であり、すべてのJust/Nothingケースで異なることを行う必要がある場合は、それらをすべて書き留める必要があります。しかし、いくつかのネストされたcaseステートメントの代わりに、それらを 1 つの大きなパターン マッチに組み合わせることができます。

f Nothing                = x
f (Just Nothing))        = y
f (Just (Just Nothing))  = z 
f (Just (Just (Just d))) = d
于 2013-10-29T10:56:20.690 に答える
4

更新 2

Monad Eitherあなたのためです

import Data.Maybe (maybe)

maybeE :: e -> Maybe a -> Either e a
maybeE e = maybe (Left e) Right

f :: Maybe (Maybe (Maybe d)) -> Either e d
f a  =   maybeE x a 
     >>= maybeE y
     >>= maybeE z

更新 3

型を取りたくない場合はEither、関数を次のように書き直すことができます。

import Data.Either(either)

either' = either id id

f :: Maybe (Maybe (Maybe d)) -> d
f a = either' $ maybeE x a 
            >>= maybeE y
            >>= maybeE z
于 2013-10-29T10:44:19.270 に答える