Как я могу встроить эту функцию?
У меня есть две функции, но одна из функций вызывается только из другой, поэтому я хотел бы включить вспомогательную функцию. Мой код выглядит так:
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