题
我一直在试图获得成F#和关闭了一段时间,但我一直得到推迟。为什么?
因为无论其'初学者的资源,我尝试看看我看看很简单的例子,开始使用操作员 ->
.
然而,没有,我发现还提供了一个明显简单的解释什么,这个运营者的装置。这是因为虽然它必须如此显而易见的,它不需要解释,甚至完成新手。
我因此,必须非常密集,或者也许这是将近3年以前的经验,保持我回来。
有人可以请解释或指向一个真正的资源,解释了吗?
解决方案
' - >'不是运营商。它出现在许多地方的F#语法中,其含义取决于它如何用作更大结构的一部分。
在某个类型中,' - >'描述了人们如上所述的功能类型。例如
let f : int -> int = ...
说'f'是一个接受int并返回int的函数。
在lambda内部(“以'fun'关键字"开头的东西),' - >'是将参数与正文分开的语法。例如
fun x y -> x + y + 1
是一个表达式,它定义了具有给定实现的两个参数函数。
在“匹配”内构造,' - >'是一种语法,它将模式与模式匹配时应运行的代码分开。例如,在
中match someList with
| [] -> 0
| h::t -> 1
每个' - >'左边的东西是模式,如果左边的模式匹配,右边的东西就会发生。
理解上的困难可能源于错误的假设' - >'是“运营商”只有一个意思。类比可能是“。”。在C#中,如果您之前从未见过任何代码,并尝试分析“。”基于查看“obj.Method”的运算符和“3.14”和“System.Collections”,你可能会感到非常困惑,因为符号在不同的上下文中有不同的含义。然而,一旦你了解了足够的语言来识别这些背景,事情就会变得清晰。
其他提示
它基本上意味着“映射到”。以这种方式阅读或“将其转化为”或类似的东西。
所以,从 F#在20分钟内教程,
> List.map (fun x -> x % 2 = 0) [1 .. 10];;
val it : bool list
= [false; true; false; true; false; true; false; true; false; true]
代码(fun i - > i%2 = 0)定义 一个匿名函数,称为lambda 表达式,有一个参数x和 该函数返回“x”的结果 %2 = 0“,这是否是x 甚至。
第一个问题-你熟悉lambda表在C#?如果是这样的->在F#相同=>在C#(我认为你阅读它,去').
的->运营商也可以发现的上下文的模式匹配
match x with
| 1 -> dosomething
| _ -> dosomethingelse
我不知道如果这也是一个氧表达,或者别的东西,但是我想的'变成'仍然成立。
也许你真的指的是F#析程序的'神秘的答复:
> let add a b = a + b
val add: int -> int -> int
这个装置(如大多数示例解释)就是一个'val',需要两个整数和返回的一个int.对我来说这是完全不透明的开始。我的意思是,我怎么知道添加不是一个val,需要一个int和返回的两个整数?
好的,事情是,在某种意义上,它不。如果我给添加只是一个int,我得到的回(int->int):
> let inc = add 1
val inc: int -> int
此(讨好)是一个东西,使F#这么性感的,对我来说。
为有用的信息上,我们发现,博客更有用的任何官方'文件':这里有一些名字,以查出来
- 达斯汀*坎贝尔 (那是diditwith.net中引用另一个的答案)
- 不塞姆 ('的'男人)
- Tomasp.net (aka 托马斯Petricek)
- 安德鲁*肯尼迪 (用于测量单位)
- Fsharp.它的 (着名的项目,欧拉解决方案)
- http://lorgonblog.spaces.live.com/Blog (aka 布赖恩)
- 乔莫尔
(a - > b)表示“从a到b的函数”。在类型注释中,它表示函数类型。例如,f:(int - > String)表示f指的是一个取整数并返回一个字符串的函数。它也可以用作这些值的构造函数,如
val f : (int -> int) = fun n -> n * 2
创建一个值,该值是从某个数字n到相同数字乘以2的函数。
这里有很多很棒的答案,我只是想以另一种思考方式添加对话。
' - > '意味着功能。
'a - > 'b是一个带'a并返回'b
的函数('a *'b) - > ('c *'d)是一个带有类型元组('a,'b)并返回('c,'d)元组的函数。例如int / string返回float / char。
有趣的地方是'a - >的级联情况'b - > 'C。这是一个函数,它接受'a并返回一个函数('b - >'c),或一个带'b - >的函数。 “C
所以如果你写: 设f x y z =()
类型将是f:'a - > 'b - > 'c - >单位,所以如果你只应用第一个参数,结果将是一个curried函数'b - > 'c - > '单元。
从 Microsoft:
功能类型的类型给出来 一流的功能价值观和正 写int->int。它们是相似的 到。净委托类型,除了他们 不是给定名称。所有F#功能 标识能够被用作为第一流的 功能的价值观和匿名的 功能价值可以使用 本(有趣的...->...)表达形式。
许多伟大的回答这个问题,谢谢的人。我想把这里的一个编辑的答复,带来的东西放在一起。
对于那些熟悉C#理解->同=>lamba的表达是一个很好的第一步。这种用法是:-
fun x y -> x + y + 1
可以理解为等同于:-
(x, y) => x + y + 1;
但是它清楚->有更多的基波含义,它源自一概念的功能,需要两个参数,例如以上所述可减少(这是正确的术语?) 一系列职能只是采取一个参数。
因此,在上述描述在这样的:-
Int -> Int -> Int
这真的帮了知道->是正确的关联,因此可对上述考虑:-
Int -> (Int -> Int)
啊哈!我们有一个功能,需要Int和返回(Int->Int)(a咖喱?).
的解释是->也可以出现的一部分类型等复杂也给予帮助。(Int->Int)的类型的任何功能,这需要一个Int和返回的一个Int.
还有用是的->出现在其他法如匹配,但也有它不具有相同意义?是正确的?我不确定它是。我怀疑它具有相同的含义,但我没有的词汇来表达。
注目的这种答案并不产生进一步的答案,但须协作编辑通过你人们创造一个更明确的答案。Utlimately这将是良好的,所有uncertainies和fluf(例如本段)被删除和更好的实例增加。让我们试着保持这个答案,因为访问的外行为可能。
在定义函数的上下文中,它类似于C#3.0中lambda表达式的 =>
。
F#: let f = fun x -> x*x
C#: Func<int, int> f = x => x * x;
F#中的 - &gt;
也用于模式匹配,这意味着:如果表达式匹配 |
和之间的部分 - &gt;
,然后应该返回 - &gt;
之后的结果:
let isOne x = match x with
| 1 -> true
| _ -> false
关于Haskell等语言的好处(它在F#中非常相似,但我不知道确切的语法 - 这应该有助于你理解 - >,但是)是你只能应用参数的一部分,创建 curried 函数:
adder n x y = n + x + y
换句话说:“给我三件事,我会把它们加在一起”。当你向它抛出数字时,编译器将推断出n x和y的类型。说你写
adder 1 2 3
1,2和3的类型是Int。因此:
adder :: Int -> Int -> Int -> Int
也就是说,给我三个整数,我将成为一个整数,最终,或者说是同样的事情:
five :: Int
five = 5
但是,这是很好的部分!试试这个:
add5 = adder 5
你还记得,adder接受一个int,一个int,一个int,然后给你一个int。然而,这不是全部真相,你很快就会看到。实际上,add5将具有以下类型:
add5 :: Int -> Int -> Int
就好像你已经“剥离”了一样。整数(最左边),并将其直接粘贴到函数。仔细观察功能签名,我们注意到 - &gt;是正确联想的,即:
addder :: Int -> (Int -> (Int -> Int))
这应该很清楚:当你给加法器第一个整数时,它会评估第一个箭头右边的任何一个,或者:
add5andtwomore :: Int -> (Int -> Int)
add5andtwomore = adder 5
现在您可以使用add5andtwomore而不是“adder 5”。这样,您可以应用另一个整数来获取(比如说)“add5and7andonemore”:
add5and7andonemore :: Int -> Int
add5and7andonemore = adder 5 7
如你所见,add5and7andonemore想要另一个参数,当你给它一个时,它会突然变成一个整数!
> add5and7andonemore 9
=> ((add5andtwomore) 7) 9
=> ((adder 5) 7) 9)
<=> adder 5 7 9
将参数替换为加法器(n x y)为(5 7 9),我们得到:
> adder 5 7 9 = 5 + 7 + 9
=> 5 + 7 + 9
=> 21
实际上,plus也只是一个接受int并返回另一个int的函数,所以上面的内容更像是:
> 5 + 7 + 9
=> (+ 5 (+ 7 9))
=> (+ 5 16)
=> 21
你去吧!