【发布时间】:2011-07-28 09:41:12
【问题描述】:
当我意识到我在某个地方需要一个额外的价值时,我通常会有一个“哦,是的”时刻写 F#。这通常很容易通过向传递的元组添加另一个值来完成。但是,这意味着各种地图/排序/收集/等。需要更新,特别是 fst/snd 函数仅适用于长度为 2 的元组。
这不是一个大问题,但在探索性开发过程中已经很烦人了,我想我会写一个帮助程序来减轻烦恼:
let inline get2 (t:^a) = (^a : (member get_Item2 : unit -> string) (t, ()))
let inline get2a (t:^a) = (^a : (member Item2 : string) t)
但是,这两个版本都不起作用。第一个,get2,不会编译,“预期 1 表达式,得到 2”。第二个 get2a 将编译,但随后不能用于元组:“类型 '(int * string)' 不支持任何名为 'get_Item2' 的运算符”。
有什么方法可以做到不涉及大量重载吗? 带有嘈杂的 (F# 2.0 中不需要注释)OverloadID 注释
【问题讨论】:
-
除此之外 - 为什么 C++ 仍然是唯一具有灵活、实用泛型的语言 - 约束会被推断出来,会起作用,并且由于数字模板参数在任何情况下都是不必要的......跨度>
-
自 F# 2.0 起不再需要
OverloadID属性 -
嘿,很高兴知道!
标签: generics f# constraints