Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sml 为什么将foldr与@currening产生运算符域错误?_Sml - Fatal编程技术网

Sml 为什么将foldr与@currening产生运算符域错误?

Sml 为什么将foldr与@currening产生运算符域错误?,sml,Sml,所以我写了一个扁平的fn,我做到了: fun flatten ls = List.foldr op @ [] ls 我意识到命名变量ls应该是不必要的,相反,我可能只需要部分应用foldr。但这打破了: val flatten = List.foldr op @ [] 是什么把事情搞得一团糟?我似乎必须为fun声明和部分应用的foldr推断类型 类似的求和函数也起作用,这让我想知道为什么@特别不起作用: val sum = List.foldr op + 0 编辑:我收到的错误: - v

所以我写了一个扁平的fn,我做到了:

fun flatten ls = List.foldr op @ [] ls
我意识到命名变量
ls
应该是不必要的,相反,我可能只需要部分应用
foldr
。但这打破了:

val flatten = List.foldr op @ []
是什么把事情搞得一团糟?我似乎必须为
fun
声明和部分应用的
foldr
推断类型

类似的求和函数也起作用,这让我想知道为什么
@
特别不起作用:

val sum = List.foldr op + 0

编辑:我收到的错误:

- val flatten = List.foldr op @ [];

stdIn:1.6-2.13 Warning: type vars not generalized because of
   value restriction are instantiated to dummy types (X1,X2,...)
val flatten = fn : ?.X1 list list -> ?.X1 list

- flatten [[1], [1]];

stdIn:3.1-3.19 Error: operator and operand don't agree [literal]
  operator domain: ?.X1 list list
  operand:         int list list
  in expression:
    flatten ((1 :: nil) :: (1 :: nil) :: nil)

我有点不清楚你到底指的是什么错误。您在标题中提到您得到了一个“操作员域错误”,但是您的代码只会产生一个“值限制”警告。这有很大的区别

值限制是更复杂的事情之一,但本质上它是为了在语言中有引用时保持类型安全


MLton wiki上有一篇很好的文章,介绍了值限制存在的原因、不必要的拒绝程序、值限制的替代方案以及如何使用值限制

我有点不清楚你到底指的是什么错误。您在标题中提到您得到了一个“操作员域错误”,但是您的代码只会产生一个“值限制”警告。这有很大的区别

值限制是更复杂的事情之一,但本质上它是为了在语言中有引用时保持类型安全

MLton wiki上有一篇很好的文章,介绍了值限制存在的原因、不必要的拒绝程序、值限制的替代方案以及如何使用值限制

AJ, Jesper的文章既解释了您看到的警告,也很有见解,但要想更实际地解决您的问题,您可能需要尝试以下方法:

val flatten = foldr op @ ([]:int list);
我相信这会解决你的问题

EDIT:我选择了
int list
作为显式类型,因为我观察到了您警告消息的性质,并从中推断,
int list
是您所需要的。[=

注意:上述解决方案破坏多态性并将输入限制为所选类型。

AJ, Jesper的文章既解释了您看到的警告,也很有见解,但要想更实际地解决您的问题,您可能需要尝试以下方法:

val flatten = foldr op @ ([]:int list);
我相信这会解决你的问题

EDIT:我选择了
int list
作为显式类型,因为我观察到了您警告消息的性质,并从中推断,
int list
是您所需要的[=


注意:上述解决方案会破坏多态性,并将输入限制为所选类型。

已编辑。语句本身不会中断,但我无法使用它!终于有时间通读了这篇文章,似乎val语句不起作用的原因是,除非传递的类型正确,否则无法键入
nil
列表ls中的ed是已知的。我有这个权利吗?空列表和append函数都是多态的。因此,这两个函数都使最终语句成为多态函数。编辑。语句本身没有中断,但我不能使用它!终于有时间通读了这篇文章,这似乎是val语句的原因nt的工作是,除非传入的
ls
的类型已知,否则不能键入
nil
列表。我有这个权利吗?空列表和append函数都是多态的。因此,它们都使final语句成为多态函数。谢谢你的建议!破坏多态性是毫无意义的我同意…使用
fun
似乎是最明智的解决方案,而且绝对可以避免不必要的麻烦。在这种情况下,是的。但是在很多其他情况下,您可以像最初尝试的那样使用val绑定,而不是为其创建函数。谢谢您的建议!这绝对是一个好主意但破坏多态性毫无意义,因此我将坚持使用fun syntaxI agree…使用
fun
似乎是最明智的解决方案,而且绝对可以避免不必要的麻烦。在这种情况下,是的。但是在很多其他情况下,您可以像最初尝试的那样使用val绑定,而不是为其创建函数。