(Haskell)用简单的英语显示列表?

时间:2014-10-13 16:20:26

标签: haskell functional-programming

我一直在写一个非常简单的文本游戏引擎,我遇到了一个问题:我需要能够用简单的英语打印一个项目列表。基本上,我需要一个函数,它接受一个字符串数组并输出它们,就像英语使用者说​​的那样。例如:

showEnglish ["door", "car", "cat", "apple"] = "a door, a car, a cat, and an apple."

在哈斯克尔有一个干净而快速的方法吗?感谢。

2 个答案:

答案 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的人。