"运算符不是函数"关于`$`用法

时间:2015-03-11 02:10:22

标签: sml

鉴于以下内容:

// 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

1 个答案:

答案 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。你可以查看相应的文档。