Как я могу встроить эту функцию?

У меня есть две функции, но одна из функций вызывается только из другой, поэтому я хотел бы включить вспомогательную функцию. Мой код выглядит так:

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 ответа

Решение

GHC, вероятно, автоматически включит его при оптимизации. Однако, чтобы заставить это сделать, просто добавьте {-# INLINE posToPoS #-} где-то в коде, предпочтительно прямо рядом с определением posToPoS,

Для того, чтобы сделать его локальным, так что только posEntity можно увидеть, вы хотите, где пункт. Определите это так:

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

Вы можете просто вставить строки в определении в 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 части, я забыл, что такое приоритет оператора)

В вашем примере простое утверждение 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
Другие вопросы по тегам