在Haskell中获取列表的最后一个元素的最有效方法是什么?
示例:getLastElement [1,2,3,4]应该返回4.
据我所知,last [1,2,3,4]由于Haskell挖掘列表导致列表长度O(n)在哪里的效率,因此效率不高n.
这是一段相当简单的代码.它需要一个整数并使用商和余数分解其十进制数字.在每次调用时,它会打印一行r字符'I',其中r是最后一位数字,然后用商作为新参数调用自身.
decToUnary 0 = return ()
decToUnary n = let (q, r) = quotRem n 10 in
do
putStrLn (take r "IIIIIIIIII")
decToUnary q
Run Code Online (Sandbox Code Playgroud)
它适用于少于10位数的数字,但对于10位或更多位数字,它会对输出进行加扰.我做错了什么,为什么这样做?以下是输出的一些示例,第一个是正确的,第二个是错误的:
*Main> decToUnary 5432
II
III
IIII
IIIII
*Main> decToUnary 5432101234
IIIIIIII
III
IIIIIIIII
III
III
I
IIIIIII
III
I
I
Run Code Online (Sandbox Code Playgroud) fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
sum' :: (Integral a) => [a] -> a
sum' [] = 0
sum' [a] = foldr (+) 0 ([a])
main = do putStrLn "Enter a number:"
num <- readLn
sum' (take num fibs)
Run Code Online (Sandbox Code Playgroud)
这是我的代码,以获取递归生成列表的总和.
我本可以完成foldr操作take num fibs,但是我希望能够更好地控制列表,并想要一种方法,我可以将列表中特定元素的总和而不是整个列表.
我哪里错了?
我正在尝试编写一个iterator我可以使用
的函数iterator l f,其中l是一个Int数字列表,f是一个单参数函数.该iterator函数应检查当f函数应用于列表的第一个元素时,它= =列表的第二个元素,依此类推所有元素.如果每个元素f都应用于前一个元素,它应该返回true .
它应该像这样工作:
iterator [3,4,5] (+1) -> True
iterator [2,4,5] (+1) -> False
Run Code Online (Sandbox Code Playgroud)
我试图编写一个函数,它接受列表和f函数,并检查列表头部和第二个函数是否为真,然后在迭代器函数map中应用于列表的该函数,但它不是编译和我不知道我的想法是否正确.
这是我最近的尝试:
func xs f1
| null xs = False
| ((head xs) f1)==(head(tail xs))=True
| otherwise = False
iterator l f
| null l = False
| map (func l f) l ==True=True
| otherwise = False
Run Code Online (Sandbox Code Playgroud) 再一次,我用这段代码遇到了障碍......我发布的早期代码与之前的代码差别很大,所以现在它的变化,问题就出现了!所以我有一个功能
convertToHTML :: String -> String
convertToHTML [] = [] --prevents calling head on empty line
convertToHTML x
| doubleHash x == True = "<h3>" ++ drop 2 x ++ "</h3>"
| head x == '#' = "<h1>" ++ tail x ++ "</h1>"
| x == "---" = "<hr/>"
| otherwise = x
Run Code Online (Sandbox Code Playgroud)
现在,基本上发生了什么,我的辅助函数doubleHash x应该读取一行,如果该行以##开头,整个行上的h3标记并删除##.所以第一个后卫,我相信就是这样.所以,我认为doubleHash函数存在问题.所以这是doubleHash辅助函数
doubleHash ('#' : '#' : []) = True
doubleHash _ = False
Run Code Online (Sandbox Code Playgroud)
所以使用cons,只是说##会返回true.不确定这里有什么问题,但是当调用convertToHTML来运行doubleHash x时,它不会应用doubleHash == True的概念,所以在此行上打一个H3标签!相反,它是正确的头x并将H1标签应用于两个行...例如:文本
- >#这应该是H1标记的行
- > ##这应该是H3标记的行
然而两者都被H1标签打了一顿.
我想快速正确地减少函数以在Haskell中指向自由格式.我更愿意产生相当可读的结果.我该怎么办呢?