Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/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
Function 这是什么';()';什么意思?_Function_F#_Value Type_Unit Type - Fatal编程技术网

Function 这是什么';()';什么意思?

Function 这是什么';()';什么意思?,function,f#,value-type,unit-type,Function,F#,Value Type,Unit Type,我刚开始学法语。本书使用以下符号: let name() = 3 name() 与此不同的是: let name = 3 name ?使用()创建一个函数,该函数采用类型为unit的参数,而不是第二种情况,它只是一个简单的整数 当您想要控制函数的执行时,这一点尤为重要 主要的区别在于你什么时候 let name() = printfn "hello" 1 vs 然后 将打印一次“hello”。但是 let t = (name()) + (name()) 将打印两次“he

我刚开始学法语。本书使用以下符号:

let name() = 3
name()
与此不同的是:

let name = 3
name

使用
()
创建一个函数,该函数采用类型为
unit
的参数,而不是第二种情况,它只是一个简单的整数

当您想要控制函数的执行时,这一点尤为重要

主要的区别在于你什么时候

let name() = 
    printfn "hello"
    1
vs

然后

将打印一次“hello”。但是

let t = (name()) + (name())
将打印两次“hello”

在考虑函数求值的顺序时,必须小心这一点

考虑以下计划:

let intversion = 
    printfn "creating integer constant"
    1

printfn "integer created"

let funcversion() =
    printfn "executing function"
    1

printfn "function created"

let a = intversion + intversion
printfn "integer calculation done"
let b = (funcversion()) + (funcveriosn())
printfn "function calculation done"
这将按顺序打印以下内容

  • 创建整数常量
  • 创建的整数
  • 创建的函数
  • 整数计算完成
  • 执行功能
  • 执行功能
  • 完成功能计算
  • name
    是一个函数,类型为
    unit->int

    name
    是一个整数,类型为
    int

    在F#中,每个函数都有一个输入类型和一个输出类型。
    let name()=3
    的输入类型是
    单元
    ,它只有一个值
    ()
    。其输出类型为
    int
    ,其值从
    –2147483648
    2147483647
    。作为另一个示例,类型
    bool
    只有两个值,
    true
    false

    回到你的问题上来,
    ()
    的用法是什么。如果不指定函数的输入值,则无法执行该函数。因此,您必须为函数指定一个输入值
    let name()=3
    ,才能执行该函数。由于其输入类型为
    unit
    ,因此您只能使用
    ()

    下面是定义名称函数的另一种方法:

    let name : (unit -> int)  = (fun _ -> 3);;
    
    并将其与:

    let name : int = 3
    

    绝对不要把
    ()
    看作函数调用或类似的语法。它只是一个值,比如3,5,'q',false,或“blah”。它恰好是一个Unit类型的值,实际上它是Unit类型的唯一值,但实际上这并不重要<代码>()这里只是一个值。我怎么强调都不过分

    首先考虑

    let name x = 3
    
    这是什么?这只是在x上定义了一个函数,其中x可以是任何类型。在C#中,这将是:

    int Name<T>(T x) 
    {
        return 3;
    }
    
    或者,更简单地说

    int Name(Unit x)
    {
        return 3;
    }
    
    因此我们看到,all
    let name()=3
    是一个函数的定义,它接受一个
    Unit
    参数,并返回3,就像上面的C版本一样


    然而,如果我们看一下
    让name=3
    ,那么这只是一个变量定义,就像C#中的
    var name=3

    在回答
    ()
    是什么之前,让我们先定义一些基础知识并完成一些示例

    在F#中,a有一个名称、零个或多个参数和一个表达式

    为了保持简单,我们将使用:
    如果没有参数,则let语句为。
    如果有参数,则let语句是一个

    对于值,表达式的结果只计算一次并绑定到标识符;它是不可变的。
    对于函数,每次调用函数时都会对表达式求值

    所以这个

    let a = System.DateTime.Now;;
    
    将始终具有第一次计算或稍后调用它的时间,即

    a;;
    val it : System.DateTime = 1/10/2017 8:16:16 AM ...  
    a;;
    val it : System.DateTime = 1/10/2017 8:16:16 AM ...  
    a;;
    val it : System.DateTime = 1/10/2017 8:16:16 AM ...  
    
    而这个功能

    let b () = System.DateTime.Now;;
    
    每次评估时都会有一个新的时间,即

    b ();;
    val it : System.DateTime = 1/10/2017 8:18:41 AM ...  
    b ();;
    val it : System.DateTime = 1/10/2017 8:18:49 AM ...  
    b ();;
    val it : System.DateTime = 1/10/2017 8:20:32 AM ... 
    
    现在解释一下
    ()
    的含义。请注意,
    System.DateTime.Now
    不需要参数即可工作

    当表达式不需要参数时,我们如何创建函数

    每个参数都必须有一个类型,因此F#对于不需要参数的函数具有相同的值,而单位类型的唯一值是
    ()

    这是一个函数,有一个参数
    x
    ,类型为
    int

    let c x = x + 1;;
    
    这是一个函数,有一个参数
    ()
    ,类型为
    unit

    let b () = System.DateTime.Now;;
    

    我想我需要更多的例子。现在还不太清楚为什么它如此重要。不管怎样,那是什么
    ;1
    for?我将添加更多示例。
    ;1
    us相当于一个换行符,然后是一个1,因此有一个返回值。我只是把它放在Brevity里,我不明白为什么如果刚刚定义了它,“创建整数常量”会被打印出来。哦。。虽然
    intversion
    只存储
    1
    ,但它是作用域的一部分,因此它是沿着
    intversion
    定义执行的吗?@Fabricio这是正确的-要在intversion中存储1,编译器必须运行
    1
    之前的任何命令,这可能会在到达1之前产生副作用。简单地说,这只是一个没有参数的调用函数的F#形式吗?@Fabricio-Yes。但我必须添加一些内容,以超过15个字符的最小评论。@Fabricio:我不会这么说
    b
    这里有一个函数,它接受一个参数:
    unit
    。如果尝试在没有括号的情况下调用它,则会得到函数值
    b
    ,而不是
    b
    函数的结果。尝试
    让d=b;;d()
    a;;
    val it : System.DateTime = 1/10/2017 8:16:16 AM ...  
    a;;
    val it : System.DateTime = 1/10/2017 8:16:16 AM ...  
    a;;
    val it : System.DateTime = 1/10/2017 8:16:16 AM ...  
    
    let b () = System.DateTime.Now;;
    
    b ();;
    val it : System.DateTime = 1/10/2017 8:18:41 AM ...  
    b ();;
    val it : System.DateTime = 1/10/2017 8:18:49 AM ...  
    b ();;
    val it : System.DateTime = 1/10/2017 8:20:32 AM ... 
    
    let c x = x + 1;;
    
    let b () = System.DateTime.Now;;