Haskell,返回值1的列表长度

Haskell,返回值1的列表长度,haskell,ghci,Haskell,Ghci,我正在处理一些代码,似乎有一个问题我无法解决 所以我有一个方法,将输入Int递减1,直到它达到5。(我知道如果输入的值小于1,则会导致错误,但我将在稍后修复该错误) 我有第二个函数,它调用a,将列表作为参数,调用此函数并返回数字列表,我想调用此列表的长度并填充一个单独的列表(我不擅长解释,我将在下面的代码示例中演示) sub 5=返回[1] 子x= 做 xssub不返回[10,9,8,6,1],而是返回[10,9,8,6,1](列表列表),因此长度为1。你不需要退货。您在一个列表单子中,retu

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

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

我有第二个函数,它调用a,将列表作为参数,调用此函数并返回数字列表,我想调用此列表的长度并填充一个单独的列表(我不擅长解释,我将在下面的代码示例中演示)

sub 5=返回[1]
子x=
做

xssub不返回
[10,9,8,6,1]
,而是返回
[10,9,8,6,1]
(列表列表),因此长度为1。你不需要退货。您在一个列表单子中,
return
将它的值包装到一个列表中,这就是为什么您最终使用嵌套列表。你的代码应该是

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

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

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

问题在于,这个子函数的编写方式与命令式语言的编写方式类似,返回在Haskell中的含义不同:它的意思是“将这个东西包装在一个Monad中(Monad取决于上下文)”。在这里,由于您在sub的结果上使用了length,因此使用了[]monad,结果是[[10,9,8,7,6,5]]一个元素的列表,恰好是6个元素的列表。mb14正确地识别了,但只纠正了函数的第一种情况,第二种情况也是一元的,但不应该是

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

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

问题是,这个子函数的编写方式与命令式语言类似,返回在Haskell中的含义不同:它意味着“将这个东西包装在monad中(monad取决于上下文)”。在这里,由于您在sub的结果上使用了length,因此使用了[]monad,结果是[[10,9,8,7,6,5]]一个元素的列表,恰好是6个元素的列表。mb14正确地识别了,但只纠正了函数的第一种情况,第二种情况也是一元的,但不应该是

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

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

sub
的类型是什么?尝试
:键入sub
当您在GHCi中加载此代码时。sub::(Num t,Monad m,Eq t)=>t->m[t],我确实使用了函数上面的类型,但有人说这太复杂了,请不要尝试,谢谢您的回答
长度的类型是
[a]>Int
。事实证明,列表类型
[]
Monad
的一个实例,因此当您调用
length(subx)
时,
sub
的类型被专门化为
t->[[t]]
,其中
m
[]
替换。哦,我明白了,haskell中还有转换吗?我知道其他编程语言都有toString或类似的函数。是否要将
[[t]]
转换为
[t]
?有一个执行此操作的
concat
函数。顺便说一句,“将值从一种类型转换为另一种类型”正是函数的含义,如果您现在还没有注意到Haskell非常擅长函数;)
sub
的类型是什么?尝试
:键入sub
当您在GHCi中加载此代码时。sub::(Num t,Monad m,Eq t)=>t->m[t],我确实使用了函数上面的类型,但有人说这太复杂了,请不要尝试,谢谢您的回答
长度的类型是
[a]>Int
。事实证明,列表类型
[]
Monad
的一个实例,因此当您调用
length(subx)
时,
sub
的类型被专门化为
t->[[t]]
,其中
m
[]
替换。哦,我明白了,haskell中还有转换吗?我知道其他编程语言都有toString或类似的函数。是否要将
[[t]]
转换为
[t]
?有一个执行此操作的
concat
函数。顺便说一句,“将值从一种类型转换为另一种类型”正是函数的含义,如果您现在还没有注意到Haskell非常擅长函数;)谢谢你的回答,你是说我的名单现在在一个名单之内?另外,我尝试使用该代码,它给出了一个错误:发生检查:无法构造无限类型:t~[t]我的错误您需要替换
xs谢谢您的回答,那么您是说我的列表现在在一个列表中?我还尝试使用该代码,但它给出了一个错误:Occurs check:cannot construction the infinite type:t~[t]我的错误您需要替换
xs