Haskell,返回值1的列表长度
我正在处理一些代码,似乎有一个问题我无法解决 所以我有一个方法,将输入Int递减1,直到它达到5。(我知道如果输入的值小于1,则会导致错误,但我将在稍后修复该错误) 我有第二个函数,它调用a,将列表作为参数,调用此函数并返回数字列表,我想调用此列表的长度并填充一个单独的列表(我不擅长解释,我将在下面的代码示例中演示)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
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