3

2つの関数がありますが、一方の関数はもう一方の関数からのみ呼び出されるため、ヘルパー関数をインライン化します。私のコードは次のようになります。

data PoS =  N | V | Adj | Adv | Phr

posEntity :: Parser PoS
posEntity = 
    do pos <- string "N." <|>
              string "V." <|>
              string "Adj." <|>
              string "Adv." <|>
              string "Phr."
       return (posToPoS pos)
    <?> "part of speech"

posToPoS pos
    | pos == "N." = N
    | pos == "V." = V
    | pos == "Adj." = Adj
    | pos == "Adv." = Adv
    | pos == "Phr." = Phr

明らかにposToPoSはインライン化する必要がありますが、そのようなことを行うために必要な構文がわかりません。

ありがとう!

4

4 に答える 4

8

定義内の文字列を次のようにインライン化することができますposToPos

posToPoS "N." = N
posToPoS "V." = V
-- ... etc

または、パーサーで次のメソッドを直接使用できます。

import Control.Applicative hiding (<|>)

posEntity :: Parser PoS
posEntity = 
  (string "N."   *> pure N   <|>
   string "V."   *> pure V   <|>
   string "Adj." *> pure Adj <|>
   string "Adv." *> pure Adv <|>
   string "Phr." *> pure Phr)<?> "part of speech"

(パーツの周りに括弧が必要な場合がありますstring "foo" *> pure Foo。演算子の優先順位が何であるかを忘れています)

于 2012-06-20T18:09:39.123 に答える
4

GHCは、最適化時に自動的にインライン化する可能性があります。ただし、強制的に実行するに{-# INLINE posToPoS #-}は、コードのどこかに、できればの定義のすぐ隣に追加するだけですposToPoS

それをローカルにして、それだけposEntityが見えるようにするには、where句が必要です。そのように定義します。

data PoS =  N | V | Adj | Adv | Phr

posEntity :: Parser PoS
posEntity = 
    do pos <- string "N." <|>
              string "V." <|>
              string "Adj." <|>
              string "Adv." <|>
              string "Phr."
       return (posToPoS pos)
    <?> "part of speech" where
        posToPoS pos
            | pos == "N." = N
            | pos == "V." = V
            | pos == "Adj." = Adj
            | pos == "Adv." = Adv
            | pos == "Phr." = Phr
于 2012-06-20T18:05:30.877 に答える
1

あなたの例では、単純なcaseステートメントがより良い解決策のように思われます。

posEntity = 
    do pos <- string "N." <|>
              string "V." <|>
              string "Adj." <|>
              string "Adv." <|>
              string "Phr."
       return $ case pos of
                  "N." -> N
                  "V." -> V
                  "Adj." -> Adj
                  "Adv." -> Adv
                  "Phr." -> Phr
    <?> "part of speech"

選択肢があれば、一般に、同等性の比較よりもパターンマッチングの方が適しています。

于 2012-06-20T18:10:27.660 に答える
0

これが私が理解したことです。はっきりしなかったらごめんなさい:

posEntity :: Parser PoS
posEntity = 
    do pos <- string "N." <|>
              string "V." <|>
              string "Adj." <|>
              string "Adv." <|>
              string "Phr."
       return (posToPoS pos)
    <?> "part of speech"
    where
      posToPoS pos
          | pos == "N." = N
          | pos == "V." = V
          | pos == "Adj." = Adj
          | pos == "Adv." = Adv
          | pos == "Phr." = Phr
于 2012-06-20T18:09:24.197 に答える