【问题标题】:Defining a function in f#在 f# 中定义函数
【发布时间】:2019-12-16 05:22:12
【问题描述】:

在 F# 中我可以定义这样的函数

let (-+->) x y = x + y

然后这样调用

let z =  5 -+-> 6

我什至可以做这样的事情

let (-++->) x y z = x y z
let p = ((fun x -> fun y -> x + y) -++-> 5 ) 6

但是为什么我不能这样做呢?

let (nafis) x y = x + y
let p = 5 nafis 6

它给了我这个错误Unexpected identifier in binding. Expected '=' or other token

let (-+->) x y = x + y 这样的函数有什么特殊的函数吗?

【问题讨论】:

  • 我猜这是因为,就像在 OCaml 中一样,优先级和关联性由第一个符号决定,并且只为非常有限的一组符号定义。允许字母数字运算符名称似乎也很模棱两可。例如,您如何解析a nafis b? is 是一个函数应用程序,其中nafisb 应用于a,或者ab 应用于运算符nafis
  • 有讨论扩展语言以支持类似的东西:github.com/fsharp/fslang-suggestions/issues/772

标签: function functional-programming f#


【解决方案1】:

运算符的词法约束在 F# 规范中定义:

3.7 符号运算符

用户定义和库定义的符号运算符是 字符如下所示,除了字符序列是 一个符号关键字(§3.6)。

regexp first-op-char= !%&*+-./<=>@^|~
regexp op-char= first-op-char | ?
token quote-op-left = 
  | <@ <@@ 
token quote-op-right =  
  | @> @@> 
token symbolic-op= 
  | ?
  | ?<-
  | first-op-charop-char* 
  | quote-op-left
  | quote-op-right

如您所见,-++-&gt; 有效,而nafis 无效。

【讨论】:

    猜你喜欢
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    相关资源
    最近更新 更多