如何命名F#函数声明的参数

时间:2015-10-20 21:02:47

标签: f#

如果我有一个包含所有数据库函数的记录类型,那么

type Database =
  { getThingsByCountThenLength: int -> int -> Thing list
    getUsersByFirstNameThenLastName: string -> string -> User list }

有没有办法命名输入参数,所以更清楚?类似下面的内容(不编译)

type Database =
  { getThings: count:int -> length:int -> Thing list
    getUsers: firstName:string -> lastName:string -> User list }

(注意 为接口工作;我只是想要它用于记录。)

type IDatabase =
  abstract getThings: count:int -> length:int -> Thing list
  abstract getUsers: firstName:string -> lastName:string -> User list

3 个答案:

答案 0 :(得分:5)

这不是一个直接的答案(我不认为有一个),但作为替代方案,你可以使用single-case union types,这不仅会增加清晰度并继续允许currying,还会强制执行编译时正确性。

type Count = Count of int
type Length = Length of int
type FirstName = FirstName of string
type LastName = LastName of string

type Database =
  { getThings: Count -> Length -> Thing list
    getUsers: FirstName -> LastName -> User list }

答案 1 :(得分:3)

类型别名可能是您想要的:

type count = int
type length = int
type firstName = string
type lastName = string

type Database =
  { getThings: count -> length -> Thing list
    getUsers: firstName -> lastName -> User list }

虽然,在这种情况下,它们看起来很奇怪

其他选项是使用记录

type whatever = {
  count : int;
  length : int;
}

let param = { count = 1; length = 1; }

param |> printfn "%A"

答案 2 :(得分:2)

如前所述,我不认为您可以在记录中命名函数的参数。

但是,您可以在界面内命名成员的参数。如果您对使用界面感到满意,那么您可以编写如下内容:

set :protection, :except => [:json_csrf]

对于跨多个文件使用的类型,我通常更喜欢遵循.NET编码风格,因此我可能会选择一个接口 - 除非有一些选择记录的充分理由。然而,这肯定是个人偏好的问题。风格。