1

大多数编程语言都有一些在编译时根据类型选择实现的方法。函数重载是执行此操作的常用方法。使用模板(在 C++ 或 D 中可能带有约束)是另一种选择。

但是在 F# 中,如果不使用类方法,我无法找到如何做到这一点,从而失去了一些不错的属性,比如柯里化。

let f (a:int) = 

Duplicate definition of 'f'

F# 具有静态解析的类型参数,但我不知道如何使用它..

let f (a:^T) =
    match T with

The value or constructor of T is not definedmatch T

let f (a:^T) =
    match a with
    | :> int as i -> 

Unexpected symbol ':>' in expression

let f (a:^T) =
    match ^a with
    | :> int as i -> 

Unexpected infix operator in expression

4

1 回答 1

4

如果您想编写一个针对不同类型表现不同的函数并且是一个普通的 F# 函数,那么静态成员约束可以让您这样做。但是,如果您想编写惯用的 F# 代码,那么还有其他选择:

  • 这是一个很好的例子,展示了如何使用静态成员约束来做到这一点

  • F# 集合对每种类型使用不同的模块,因此有Array.map,List.mapSeq.map。这是函数式 F# 库的惯用风格。

  • FSharpChart是一个使用重载方法的库示例。请注意,您可以使用静态方法,因此您可以编写Chart.Line [ ... ]并且它会选择正确的重载。

  • 如果您想编写通用数字代码,那么我最近写了一个涵盖该主题的教程

所以,在使用静态约束之前我会小心一点——它并不完全是惯用的(例如在标准库中不常用),因此可能会引起一些混乱。但它非常强大,而且肯定很有用。

关键是仅仅遵循在其他语言中运行良好的模式可能不会在 F# 中为您提供最佳结果。如果您可以提供一个具体示例来说明您正在尝试做什么,那么您可能会得到更好的结果。

于 2013-08-21T19:35:14.067 回答