Haskell,返回值1的列表长度

时间:2015-01-23 22:45:19

标签: haskell ghci

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

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

我有第二个函数调用一个List作为参数调用这个函数并返回数字列表,我想在这个列表上调用长度并填充一个单独的列表(我不是最好的在解释时,我将在下面的代码示例中显示)

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]。 / p>

在我脑海中,我认为输出为6,因为它有6个元素。

有没有人知道为什么会发生这种情况和/或解决问题?

提前致谢。

2 个答案:

答案 0 :(得分:2)

sub不返回[10,9,8,6,1]而是返回[[10,9,8,6,1]](列表列表),因此长度为1.您不需要返回。您在列表monad中,return将其值包装到列表中,这就是为什么您最终会使用嵌套列表。你的代码应该是

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

答案 1 :(得分:2)

问题在于这个子函数的编写方式与命令式语言类似,并且返回在Haskell中并不意味着同样的事情:它意味着“将这个东西包装在Monad中(Monad依赖于上下文)” 。这里因为你对sub的结果使用了length,所以使用了list [] monad,结果是[[10,9,8,7,6,5]]一个元素的列表恰好是6个元素的列表。 mb14正确识别出那个但是后来只纠正了你的第一个案例,第二个案例也是monadic但不应该...

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

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