小编And*_*ewC的帖子

以有效的方式从列表中获取最后一个元素

在Haskell中获取列表的最后一个元素的最有效方法是什么?

示例:getLastElement [1,2,3,4]应该返回4.

据我所知,last [1,2,3,4]由于Haskell挖掘列表导致列表长度O(n)在哪里的效率,因此效率不高n.

haskell

1
推荐指数
3
解决办法
1475
查看次数

对具有10位或更多位数的数字进行加扰数字转换

这是一段相当简单的代码.它需要一个整数并使用商和余数分解其十进制数字.在每次调用时,它会打印一行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)

haskell

1
推荐指数
1
解决办法
214
查看次数

无法在Haskell中获取列表的总和

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,但是我希望能够更好地控制列表,并想要一种方法,我可以将列表中特定元素的总和而不是整个列表.

我哪里错了?

haskell

1
推荐指数
1
解决办法
168
查看次数

如何创建一个函数iterator xs f,其中xs是一个列表,f是Haskell中的一个函数

我正在尝试编写一个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)

haskell list

1
推荐指数
1
解决办法
179
查看次数

调试一些Haskell函数,守卫

再一次,我用这段代码遇到了障碍......我发布的早期代码与之前的代码差别很大,所以现在它的变化,问题就出现了!所以我有一个功能

 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标签打了一顿.

html debugging haskell helpers

0
推荐指数
2
解决办法
77
查看次数

Haskell实用程序使函数点免费

我想快速正确地减少函数以在Haskell中指向自由格式.我更愿意产生相当可读的结果.我该怎么办呢?

haskell lambda-calculus pointfree combinatory-logic

0
推荐指数
1
解决办法
169
查看次数