鉴于以下内容:
// credit to http://stackoverflow.com/questions/28802305/trying-to-define-type
datatype 'alpha susp = $ of 'alpha
fun sum n = if n = 0 then 1
else n + sum(n-1)
这个错误是什么意思?
- use "Lazy.sml";
[opening Lazy.sml]
datatype 'a susp = $ of 'a
val sum = fn : int -> int
val it = () : unit
- val foo = $sum 100000000000;
stdIn:17.5-17.28 Error: operator is not a function [tycon mismatch]
operator: (int -> int) susp
in expression:
($ sum) 100000000000
答案 0 :(得分:1)
声明一个新的数据类型之后,你应该将它用作一个函数(实际上它确实变成了一个函数):
- datatype 'alpha susp = $ of 'alpha;
datatype 'a susp = $ of 'a
- fun sum n = if n = 0 then 1
= else n + sum(n-1);
val sum = fn : int -> int
- $(sum 10);
val it = $ 56 : int susp
- $;
val it = fn : 'a -> 'a susp
在你的问题中,你有错误:
- val foo = $sum 100000000000;
stdIn:17.5-17.28 Error: operator is not a function [tycon mismatch]
operator: (int -> int) susp
in expression:
($ sum) 100000000000
注意:
[tycon mismatch]
和
operator: (int -> int) susp
in expression:
($ sum) 100000000000
这意味着它是类型错误,类型不匹配。你应该知道sml中的函数只需要一个参数,所以很容易找到关联:
表达式$ sum 100000000000
相当于(($ sum) 100000000000)
,这意味着您首先创建一个变量($ sum)
,其类型为(int -> int) susp
,然后将其用作函数并将参数传递给它,这会导致此错误。
实际上,您将此函数称为链的方式在sml中具有名称(甚至在通用函数编程中),称为curry
。你可以查看相应的文档。