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

(Haskell)用简单的英语显示列表?,haskell,functional-programming,Haskell,Functional Programming,我一直在编写一个非常简单的文本游戏引擎,但我遇到了一个问题:我需要能够用简单的英语打印项目列表。所以本质上,我需要一个函数,它接受一组字符串,并像说英语的人那样输出它们。例如: showEnglish ["door", "car", "cat", "apple"] = "a door, a car, a cat, and an apple." 在haskell有没有干净快捷的方法?谢谢。问题1:在英语中,有些词的前缀是“a”,而另一些词的前缀是“an”。应该可以这样解决: prefixWord

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

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

在haskell有没有干净快捷的方法?谢谢。

问题1:在英语中,有些词的前缀是“a”,而另一些词的前缀是“an”。应该可以这样解决:

prefixWord :: String -> String
prefixWord "" = ""
prefixWord word =
  if (toLower $ head $ word) `elem` "aeiou"
    then "an " ++ word
    else "a "  ++ word
问题2:将它们全部连接在一起,最后加一个“and”

joinWords :: [String] -> String
joinWords ws = (intercalate ", " (init ws)) ++ " and " ++ last ws
总而言之:

showEnglish :: [String] -> String
showEnglish = joinWords . map prefixWord

问题1:在英语中,有些词的前缀是“a”,而另一些词的前缀是“an”。应该可以这样解决:

prefixWord :: String -> String
prefixWord "" = ""
prefixWord word =
  if (toLower $ head $ word) `elem` "aeiou"
    then "an " ++ word
    else "a "  ++ word
问题2:将它们全部连接在一起,最后加一个“and”

joinWords :: [String] -> String
joinWords ws = (intercalate ", " (init ws)) ++ " and " ++ last ws
总而言之:

showEnglish :: [String] -> String
showEnglish = joinWords . map prefixWord
粗略地说,你可以从软件包中找到一个单词的用法。看起来该软件包仅用于这种“特殊”用途。它还有一个插入逗号的函数,不幸的是,这是令人讨厌的,因为它省略了。因此,也许只需使用
插入
。但是:

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

的人,粗略地说,您可以从包中找到一个单词的名称。看起来该软件包仅用于这种“特殊”用途。它还有一个插入逗号的函数,不幸的是,这是令人讨厌的,因为它省略了。因此,也许只需使用
插入
。但是:

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

@CarstenKönig的人,建立语法正确的句子是一件连Word都很难做到的事情,而这个程序是由一个庞大的开发团队在过去20年左右的时间里与该领域的许多专家共同构建的。我认为这个答案应该足以说明stackoverflow;)它说明了基本方法。对于“文本游戏”,这加上一些捏造的因素可能就足够了。对于一个语言分析程序来说,可能没有那么多……应该是
last w
而不是
last ws
吗?@CarstenKönig构建语法正确的句子是连微软Word都很难做到的事情,而该程序是由一个庞大的开发团队在过去20年左右的时间里与该领域的许多专家共同构建的。我认为这个答案应该足以说明stackoverflow;)它说明了基本方法。对于“文本游戏”,这加上一些捏造的因素可能就足够了。对于一个语言分析程序来说,可能没有那么多…应该改为
lastw
还是
lastws