相关疑难解决方法(0)

F#和鸭子打字

假设我在F#中定义了以下两种类型:

type Dog = { DogName:string; Age:int }
type Cat = { CatName:string; Age:int }
Run Code Online (Sandbox Code Playgroud)

我期待以下方法适用于猫和狗:

let isOld x = x.Age >= 65
Run Code Online (Sandbox Code Playgroud)

实际上,似乎isOld只会接受猫:

let dog = { DogName = "Jackie"; Age = 4 }
let cat = { CatName = "Micky"; Age = 80 }

let isDogOld = isOld dog //error
Run Code Online (Sandbox Code Playgroud)

我希望F#足够聪明,可以X为猫和狗定义某种"虚拟"界面,这样就isOld可以接受X作为参数,而不是a Cat.

这不是F#在任何情况下处理的事情,我是对的吗?似乎F#类型的推理系统不会做任何比C#对var类型变量做的更多的事情.

.net f# functional-programming type-inference duck-typing

15
推荐指数
2
解决办法
1381
查看次数

具有特定属性的记录类型的F#类型约束

我正在尝试创建一个泛型函数,它需要它的类型参数,它是一个记录类型,并且它有一个特定的属性.这是一个生成相关编译器错误的示例:

let foo<'a> (a : 'a) =
    a' = { a with bar = "baz" }
    a'
Run Code Online (Sandbox Code Playgroud)

编译这个我得到一个错误说明The record label bar is not defined.

我尝试添加以下类型约束:

let foo<'a when 'a : (member Id : string)> =
    // ...
Run Code Online (Sandbox Code Playgroud)

但那也没有编译,抱怨说 This code is not sufficiently generic. The type variable ^a when ^a : (member get_Int : ^a -> string) could not be generalized because it would escape its scope.

有没有办法指定一个允许我正确执行此操作的类型约束?

generics f# type-constraints

4
推荐指数
2
解决办法
1438
查看次数