簡體   English   中英

我該如何內聯此功能?

[英]How can I inline this function?

我有兩個函數,但其​​中一個函數只從另一個函數調用,所以我想內聯輔助函數。 我的代碼看起來像這樣:

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應該內聯,但我不確定做這樣的事情所需的語法。

謝謝!

您可以將定義中的字符串內聯到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部分的parens,我忘記運算符優先級是什么)

GHC可能會在優化時自動內聯。 但是,要強制它這樣做,只需在代碼中的某處添加{-# INLINE posToPoS #-} ,最好是在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

在您的示例中,一個簡單的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"

如果您有選擇,模式匹配通常比平等比較更受歡迎。

這是我想出來的。 對不起,如果我不清楚:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM