5

私はいくつかの ADT を持っていますが、それぞれに別の ADT が含まれている場合と含まれていない場合があります。下位レベルからデータを取得する必要があり、削除できると確信している非常に反復的なコードを書いています。Real World Haskell と "Learn You a Haskell For Great Good" でいくつかのサンプル コードを見てきましたが、よくわかりません。これは、ADT の省略された無関係な詳細の例です。

  T24Report
      - projTitle :: Maybe ProjectTitle
            - zip :: Maybe String

StreetAddress から郵便番号を取得するには、次のようにしました。

 projNameStr :: T24Report -> String
 projNameStr t24 = if isNothing projTitleMaybe
                    then ""
                    else (fromMaybe "") $ zip $ fromJust projTitleMaybe
                where
                    projTitleMaybe = projTitle $ project t24

オブジェクトの連鎖が深まるにつれて、コードの反復性も増します。もっと良い方法があるはずです。アイデア?参照?StackOverflow で同様の質問を見つけることができませんでしたが、ここにあるに違いないと思います...これは、尋ねられたに違いない単純な問題のようです。

ありがとう、ティム

4

2 に答える 2

6

おそらく、モナドのインスタンスは、まさにこの問題を解決するために構築されています。いくつかのオブジェクト、多分X、多分Y、多分Zがあり、それぞれタイプがMaybe a、Maybe b、Maybe cの場合、これを行うことができます

do x <- maybeX
   y <- maybeY
   z <- maybeZ
   return (x,y,z)

この型は Maybe (a,b,c) になり、3 つの Maybe のいずれかが Nothing の場合、最終結果は Nothing になります。

したがって、あなたの例では、次のようなことをします

projNameStr t24 = fromMaybe "" $ do t <- projTitle t24
                                    zip t
于 2013-01-25T19:46:57.517 に答える
6

最も一般的なケースでは、次のように書きます。

projNameStr :: T24Report -> String
projName t24 = fromMaybe "" $ do
    title <- projTitle $ project t24
    zip title

重要なポイントは、doブロックを使用してすべてのNothingケースを処理することです。

ただし、この特定のケースでは、チェーンに s が 2 つしかないMaybeため、少し短くしたいと思います。

projNameStr :: T24Report -> String
projName t24 = fromMaybe "" $ projTitle (project t24) >>= zip

これはまさに、前の例がコンパイル中に変換されるものです。通常、そのような手動の脱糖は事態を悪化させますが、良くはしません。しかし、この場合、数行短く、読むのにそれほど手間がかからないという理由だけで、これを使いたくなるでしょう。

于 2013-01-25T19:27:00.267 に答える