我一直在写一个非常简单的文本游戏引擎,我遇到了一个问题:我需要能够用简单的英语打印一个项目列表。基本上,我需要一个函数,它接受一个字符串数组并输出它们,就像英语使用者说的那样。例如:
showEnglish ["door", "car", "cat", "apple"] = "a door, a car, a cat, and an apple."
在哈斯克尔有一个干净而快速的方法吗?感谢。
答案 0 :(得分:4)
问题1:在英语中,有些单词以" a"为前缀,而其他单词则为""。应该可以像这样解决这个问题:
prefixWord :: String -> String
prefixWord "" = ""
prefixWord word =
if (toLower $ head $ word) `elem` "aeiou"
then "an " ++ word
else "a " ++ word
问题2:使用"和"加入他们所有人。最后。
joinWords :: [String] -> String
joinWords ws = (intercalate ", " (init ws)) ++ " and " ++ last ws
把它们放在一起:
showEnglish :: [String] -> String
showEnglish = joinWords . map prefixWord
答案 1 :(得分:4)
粗略地说,您可以使用indefinite determiner包中的indefiniteDet找到单词minimorph。看起来该软件包仅用于此“临时”用法。它还具有插入逗号的功能,遗憾的是它是诅咒,因为它省略了Oxford comma。所以也许只需使用intercalate
。但是:
showEnglish :: [Text] -> Text
showEnglish = commas "and" . map (\w -> indefiniteDet w `append` " " `append` w)
ghci> showEnglish ["door", "car", "cat", "apple"]
"a door, a car, a cat and an apple"
现在我们不需要对英语形态学的简化期望进行硬编码......我们会把它留给写minimorph
的人。