如果我有一个包含所有数据库函数的记录类型,那么
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
答案 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编码风格,因此我可能会选择一个接口 - 除非有一些选择记录的充分理由。然而,这肯定是个人偏好的问题。风格。