[英]How do I specify a type variable used in an inline type, is the same as a type variable used in a function definition?
[英]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.