eee*_*eee 6 f# functional-programming function
我正在学习F#,我无法弄清楚let,fun和function之间的区别是什么,而且我的教科书也没有真正解释.举个例子:
let s sym = function
| V x -> Map.containsKey x sym
| A(f, es) -> Map.containsKey f sym && List.forall (s sym) es;;
Run Code Online (Sandbox Code Playgroud)
我不能没有function关键字写这个吗?或者我可以写fun而不是function?let当我看到你写的一些例子时,我为什么要写
fun s x =
...
Run Code Online (Sandbox Code Playgroud)
真的有什么区别?
scr*_*wtp 16
我猜你应该问MSDN,但简而言之:
let使用符号绑定值.值可以是普通类型,如a int或a string,但它也可以是函数.FP函数中的值是值,可以采用与这些类型相同的方式处理.
fun 是一个引入匿名函数的关键字 - 如果您熟悉C#,请考虑使用lambda表达式.
这是两个重要的,在这个意义上,你见过的所有其他用法都可以被认为是这两个人的语法糖.所以要定义一个函数,你可以这样说:
let myFunction =
fun firstArg secondArg ->
someOperation firstArg secondArg
Run Code Online (Sandbox Code Playgroud)
这说得很清楚.您声明您有一个函数,然后将其绑定到该myFunction符号.
但是你可以通过将匿名函数声明混淆并将其绑定到符号来节省一些打字let:
let myFunction firstArg secondArg =
someOperation firstArg secondArg
Run Code Online (Sandbox Code Playgroud)
什么function是有点棘手 - match通过匹配隐式参数,您将匿名单参数函数声明与表达式结合起来.所以这两个是等价的:
let myFunction firstArg secondArg =
match secondArg with
| "foo" -> firstArg
| x -> x
let myFunction firstArg = function
| "foo" -> firstArg
| x -> x
Run Code Online (Sandbox Code Playgroud)
如果你刚刚开始使用F#,我就会避开那个.它有其用途(主要用于为地图/滤镜等提供简洁的高阶函数),但导致代码的可读性一目了然.
这些东西是彼此的捷径.
最根本的是let.这个关键字为东西命名:
let name = "stuff"
Run Code Online (Sandbox Code Playgroud)
从技术角度讲,let关键字定义了一个标识符并将其绑定到一个值:
let identifier = "value"
Run Code Online (Sandbox Code Playgroud)
在此之后,您可以在程序中使用单词name,identifier编译器将知道它们的含义.没有它let,就没有办法命名东西,你必须总是把你所有的东西写成内联,而不是通过名字来引用它的大块.
现在,价值观有不同的风格.有字符串"some string",有整数42,浮点数5.3,布尔值true等.特殊的价值就是功能.函数也是值,在大多数方面类似于字符串和数字.但是你怎么写一个函数?要写一个字符串,你使用双引号,但功能怎么样?
好吧,要编写一个函数,你可以使用特殊的单词fun:
let squareFn = fun x -> x*x
Run Code Online (Sandbox Code Playgroud)
在这里,我使用let关键字来定义标识符squareFn,并将该标识符绑定到函数类的值.现在我可以squareFn在我的程序中使用这个词,编译器会知道每当我使用它时我的意思是一个函数fun x -> x*x.
这种语法在技术上足够,但写入并不总是方便.因此,为了缩短它,let绑定会对自身承担额外的责任,并提供一种更短的方式来编写上述内容:
let squareFn x = x*x
Run Code Online (Sandbox Code Playgroud)
这应该为letvs 做fun.
现在,function关键字只是fun+ 的简短形式match.写作function等同于写作fun x -> match x with,期间.
例如,以下三个定义是等效的:
let f = fun x ->
match x with
| 0 -> "Zero"
| _ -> "Not zero"
let f x = // Using the extra convenient form of "let", as discussed above
match x with
| 0 -> "Zero"
| _ -> "Not zero"
let f = function // Using "function" instead of "fun" + "match"
| 0 -> "Zero"
| _ -> "Not zero"
Run Code Online (Sandbox Code Playgroud)