繁体   English   中英

Haskell,返回值1的列表长度

[英]Haskell, Length of list returning the value 1

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

因此,我有一种方法将输入Int减1,直到达到5。(我知道如果我输入的值小于1,会导致错误,但我稍后会解决)

我有第二个函数,它调用a将列表作为参数,然后调用该函数并返回数字列表,我想在此列表上调用长度并填充一个单独的列表(我不是最擅长解释的,我是ll显示以下代码示例)

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个元素。

有谁知道为什么会这样和/或解决它的方法?

提前致谢。

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)

问题在于,该子函数的编写方式就像您使用命令式语言一样,并且返回值在Haskell中并不意味着相同:它的意思是“将其包装在Monad中(Monad取决于上下文)”。 在这里,由于您在sub的结果上使用了长度,因此使用了列表[] monad,结果是[[10,9,8,7,6,6,5]]一个元素的列表,而该元素恰好是6个元素的列表。 mb14正确地识别出该错误,但仅纠正了函数的第一种情况,第二种情况也是单例的,但不应...

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM