【发布时间】:2011-10-27 07:31:37
【问题描述】:
假设我在 F# 中定义了以下两种类型:
type Dog = { DogName:string; Age:int }
type Cat = { CatName:string; Age:int }
我期待以下方法适用于猫和狗:
let isOld x = x.Age >= 65
实际上,似乎发生的事情是isOld 只会接受猫:
let dog = { DogName = "Jackie"; Age = 4 }
let cat = { CatName = "Micky"; Age = 80 }
let isDogOld = isOld dog //error
我希望 F# 足够聪明,可以为猫和狗定义某种“虚拟”接口 X,以便 isOld 接受 X 作为参数,而不是 Cat。
这不是 F# 在任何情况下都可以处理的事情,对吗?似乎 F# 类型推断系统不会做任何事情,而不是 C# 对 var 类型变量所做的事情。
【问题讨论】:
-
无处不在!这是一个错字。
-
您对编译器提出了很多要求,但 Google Go 可以满足您的要求,尽管函数签名不会是隐式的,但类型签名会。
-
您要求的是结构类型。
标签: .net f# functional-programming type-inference duck-typing