Haskell,返回值1的列表长度

Haskell, Length of list returning the value 1

我正在处理一些代码,似乎有一个我无法弄清楚的问题。

所以我有一个方法可以将输入 Int 减 1 直到它达到 5。(我知道如果我输入小于 1 会导致错误但我稍后会修复)

我有第二个函数,它调用一个将 List 作为参数调用此函数和 returns 数字列表,我想在此列表上调用 length 并填充一个单独的列表(我'我不是最擅长解释的,我将在下面展示代码示例)

sub 5 = return [1]
sub x =
    do 
        xs <- sub (x - 1)
        return (x:xs)       


f xs = [ length (sub x) | x<-xs ]

如果我自己调用 sub 10,它会给出输出 [10,9,8,7,6,1],但是如果我对此调用 length,它会给出输出 [1].

在我看来,我认为输出是 6,因为它有 6 个元素。

有谁知道为什么会发生这种情况and/or有解决方法吗?

提前致谢。

sub 不是 return [10,9,8,6,1],而是 [[10,9,8,6,1]](列表的列表)因此长度为 1。您不需要 return。你在一个列表 monad 中,return 将它的值包装到一个列表中,这就是你最终得到嵌套列表的原因。你的代码应该是

sub 5 = [1] -- or return 1
sub x = do
       let xs = sub (x -1)
       (x:xs)

问题是这个子函数的编写方式就像您使用命令式语言一样,return 在 Haskell 中的含义不同:它表示 "wrap this thing in a Monad (which Monad depends on the context)"。在这里,由于您在 sub 的结果上使用了 length,因此使用了列表 [] monad,结果是 [ [10, 9, 8, 7, 6, 5] ] 一个元素的列表恰好是 6 个元素的列表. mb14 正确识别但随后仅更正了函数的第一种情况,第二种情况也是单子的,但不应该是...

sub 5 = [1]
sub x = x : sub (x - 1)

是您应该使用的简单代码,这里不需要任何 monad...