gpt4 book ai didi

对列表进行递归时出现 SML [循环] 错误

转载 作者:行者123 更新时间:2023-12-04 22:23:40 26 4
gpt4 key购买 nike

我正在尝试构建一个压缩 2 个给定函数的函数,忽略较长列表的长度。

fun zipTail L1 L2 = 
let
fun helper buf L1 L2 = buf
| helper buf [x::rest1] [y::rest2] = helper ((x,y)::buf) rest1 rest2
in
reverse (helper [] L1 L2)
end

当我这样做时,我收到了错误消息:

Error: right-hand-side of clause doesn't agree with function result type [circularity]

我很好奇循环错误是什么以及我应该如何解决这个问题。

最佳答案

这里有很多问题

1) 在 helper buf L1 L2 = buf 中,模式 buf L1 L2 将匹配所有可能的输入,使您的下一个子句(一旦调试)变得多余。在上下文中,我认为您的意思是 helper buf [] [] = buf,但是在列表大小不等的情况下,您会遇到非穷尽匹配的问题。最简单的修复方法是将第二个子句(带有 x::rest1 的子句)移到顶行,然后使用第二个模式来捕获至少一个列表为空的情况.

2) [xs::rest] 是一种匹配 1 项列表的模式,其中该项是非空列表。那不是你的注意力。您需要使用 (,) 而不是 [,]

3) reverse 应该是 rev

进行这些更改后,您的定义将变为:

fun zipTail L1 L2 = 
let
fun helper buf (x::rest1) (y::rest2) = helper ((x,y)::buf) rest1 rest2
| helper buf rest1 rest2 = buf

in
rev (helper [] L1 L2)
end;

按预期工作。

错误信息本身有点难理解,但你可以这样想。在

helper buf [x::rest1] [y::rest2] = helper ((x,y)::buf) rest1 rest2

左边括号里的东西是列表的列表。所以它们的类型将是 'a list list,其中 'ax 的类型。在 x::rest1 中,rest1 的类型必须是 'a list 因为 rest1 也出现在等号的另一边与 [x::rest1] 的位置相同,那么 rest1 的类型必须与 [ 的类型相同x::rest1],这是'一个列表列表。因此 rest1 必须既是 'a list 又是 'a list list,这是不可能的。

循环来自于如果你试图理解'a list list = 'a list,你需要一个类型'a with 'a = '一个列表.这将是一个类型,其值由相同类型的值列表组成,并且该列表中的项目的值本身必须是相同类型的元素列表......这是一个永无止境的粘性循环.

关于对列表进行递归时出现 SML [循环] 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48799429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com