我对编程和练习编写函数还是新手,我试图扭转 Prelude 掉落的影响;
drop :: Int -> [a] -> [a]
drop 0 [] = []
drop 0 (x:xs) = x:xs
drop n [] = []
drop n (x:xs) = drop (n-1) xs
Run Code Online (Sandbox Code Playgroud)
变成了我最初命名为 dropR 的东西。
dropR :: Int -> [a] -> [a] -- drops from the right of the list
dropR 0 [] = []
dropR 0 (x:xs) = x:xs
dropR n [] = []
dropR n (x:xs) = reverse (drop (n-1) (reverse xs ++ [x]))
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,因为dropR 2 [1,2,3,4,5] …
我进行了以下练习(链接在一起以漂亮地打印表格并在其中进行选择的几个练习之一):
\n\n\n编写一个函数 select :: Field \xe2\x86\x92 Field \xe2\x86\x92 Table \xe2\x86\x92 给定列名和字段值的表,仅从表中选择具有给定字段的行给定列中的值。如果给定的列不存在于表中,则表应原样返回。(提示:使用函数 (!!)、elemIndex、filter 等。)
\n
最终得到了这个解决方案:
\nselect :: Field -> Field -> Table -> Table\nselect column value table@(header:rows) =\n let i = fromMaybe (-1) (elemIndex column header)\n in if i == (-1) then table\n else header : filter (\\r -> r !! i == value) rows\n
Run Code Online (Sandbox Code Playgroud)\n虽然它的功能似乎完全正确 - 它有效 - 我被告知 if-then-else 结构(例如这些)是“坏形式”,应该避免使用防护(就像我使用 fromMaybe 使用模式匹配一样) )。
\n我将如何通过模式匹配/防护将其更改为“更好”的样式?
\n