【问题标题】:F# using the .[] operator as a functionF# 使用 .[] 运算符作为函数
【发布时间】:2019-06-17 15:31:55
【问题描述】:

F# 允许将大多数运算符视为函数。例如:

let f = (+)
f 1 2 // <- 3

但是,我不确定是否可以使用索引运算符 (.[...]) 使用相同的语法。

我试过了:

let f = (.[])
f [| 1 |] 0 

'int [], int' 类型都不支持运算符 '.[]'(使用外部 F# 编译器)

还有:

let f = (.[])
f  0 [| 1 |]

类型 'int, 'a []' 不支持运算符 '.[]'(使用外部 F# 编译器)

我的猜测是.[...] 实际上不是一个运算符,而是一种特殊的内置语法,不能以函数方式使用,但也许我遗漏了一些东西。是否可以像使用 Array.get 这样的函数一样使用运算符索引?

【问题讨论】:

  • 不,这就是 Array.get 的用途 - 或者更确切地说是 Array.item 现在,它具有在管道链中部分应用的正确参数顺序。

标签: arrays f# operators


【解决方案1】:

我没有一个很好的答案,但我确实有一个可能有用的观察结果。当您尝试定义这样的内容时:

let (.[,]) v1 v2 = v1 + v2

您会收到一条错误消息:

错误 FS0035:此构造已弃用:此运算符的处理现在由 F# 编译器直接处理,其含义无法重新定义

我认为过去是使用实际运算符完成索引的情况(我似乎记得可能是这种情况,但谷歌搜索是不可能的),但正如错误消息所暗示的那样,这可能现在已经完成不同。我不确定为什么这不适用于.[]

这些funky operator names 出现在F# compiler source code 的几个地方。

【讨论】:

  • 是的,这确实说明了一些情况。 .[] 似乎被视为特殊情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 2010-10-27
  • 2020-09-19
  • 2012-05-01
相关资源
最近更新 更多