我一直在试图获得成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#这么性感的,对我来说。

为有用的信息上,我们发现,博客更有用的任何官方'文件':这里有一些名字,以查出来

(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

你去吧!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top