如何在 Haskell 中使用骨架程序

the*_*ord -2 haskell dummy-variable

下面简单介绍一下字典程序是如何构建的

dictionary = [
    ("thanks",["danke"]),
    ("always",["immer"]),
    ("us", ["uns"])
      ]
Run Code Online (Sandbox Code Playgroud)

正如你从字典中看到的,字符串成对出现

(string, [string])
Run Code Online (Sandbox Code Playgroud)

lef*_*out 5

\n

我得到了一本骨架程序形式的字典

\n
\n

不,你已经得到了一本字典

\n
dictionary :: [(String, [String])]\ndictionary = [\n    ("thanks",["danke"]),\n    ("always",["immer"]),\n    ("us", ["uns"])\n      ]\n
Run Code Online (Sandbox Code Playgroud)\n

和类型签名

\n
translate :: String -> String\n
Run Code Online (Sandbox Code Playgroud)\n

这里实际上没有 \xe2\x80\x9csculpture\xe2\x80\x9d ,但你可以将以下称为骨架translate

\n
translate (x:xs) = _\n
Run Code Online (Sandbox Code Playgroud)\n

这样做的目的是,尝试从字典中选择一个合适的元素作为输入的开头。然而,我们已经走错了路,因为输入的开始 x只是第一个字母,而要在字典中匹配,您需要整个单词。

\n

幸运的是,Haskell 附带了一个辅助函数来获取给定字符串中的单词,明智地称为words。因此,将其应用于输入字符串,然后分别翻译每个单词是有意义的:

\n
translate xs = translateWords (words xs)\n\ntranslateWords :: [String] -> String\ntranslateWords = _\n
Run Code Online (Sandbox Code Playgroud)\n

或者,如果每个单词都应该翻译成另一个单词,

\n
translate = unwords . map translateWord . words\n\ntranslateWord :: String -> String\ntranslateWord = _\n
Run Code Online (Sandbox Code Playgroud)\n

在这里,您无需担心进一步解构单词 \xe2\x80\x93,您对各个字母无能为力。相反,只要做到这一点

\n
translateWord w = _\n
Run Code Online (Sandbox Code Playgroud)\n

w现在您可以尝试匹配字典中的单词。解释一下你的尝试,

\n
translateWord w\n | w`elem`dictionary  = y\n | otherwise          = " "\n
Run Code Online (Sandbox Code Playgroud)\n

现在是什么情况呢y?并且类型与 : 的使用不匹配,elem这需要dictionary只是单词列表,而不是元组。

\n

因此,您需要的是一个工具,它不仅可以告诉您某个元素是否列表中,还可以告诉您它是否在列表元素的第一个元组部分中,以及其他元素是否在列表中。该元组的一半是。换句话说,您正在寻找签名的函数

\n
searchMatch :: a -> [(a,b)] -> b\n
Run Code Online (Sandbox Code Playgroud)\n

嗯,这个问题你可以向胡格尔询问。它在库中提供了一场比赛base

\n
lookup :: Eq a => a -> [(a, b)] -> Maybe b\n
Run Code Online (Sandbox Code Playgroud)\n

Maybe负责告诉您是否找到了匹配项。您可以对其进行模式匹配:

\n
translateWord w = case lookup w dictionary of\n Just wTranslations -> _\n Nothing            -> " "\n
Run Code Online (Sandbox Code Playgroud)\n

现在剩下的_你应该自己尝试填写。

\n