F#是一种面向对象的ML。它与Haskell广义代数数据类型和类型类最接近的是什么?
发布于 2012-11-09 16:04:45
答案取决于你试图解决的问题。F#没有类型类和GADT,因此没有直接映射。但是,F#有各种机制,您可以使用它们来解决通常在Haskell中使用GADT和类型类解决的问题:
还有一种方法可以实现emulate Haskell type classes in F#,但这通常不是一个惯用的F#解决方案,因为F#编程风格在许多方面与Haskell风格不同。它的一个相当标准的用法是定义重载操作符(参见this SO answer)。
在元级别,询问什么是另一种语言中的功能X的等价物通常会导致混乱的讨论,因为X可能用于解决一种语言中的问题A、B、C,而另一种语言可能提供不同的功能来解决相同的问题(或者一些问题可能根本不存在)。
发布于 2012-11-09 16:11:01
在F#中,您经常使用interfaces和inheritance来实现这些目的。
为了便于示例,下面是一个使用接口和object expressions的简单类型类
/// Typeclass
type MathOps<'T> =
abstract member Add : 'T -> 'T -> 'T
abstract member Mul : 'T -> 'T -> 'T
/// An instance for int
let mathInt =
{ new MathOps<int> with
member __.Add x y = x + y
member __.Mul x y = x * y }
/// An instance for float
let mathFloat =
{ new MathOps<float> with
member __.Add x y = x + y
member __.Mul x y = x * y }
let XtimesYplusZ (ops: MathOps<'T>) x y z =
ops.Add (ops.Mul x y) z
printfn "%d" (XtimesYplusZ mathInt 3 4 1)
printfn "%f" (XtimesYplusZ mathFloat 3.0 4.0 1.0)
它可能看起来不是很漂亮,但它是一种F#式的方式。对于使用操作字典的更类似于Haskell的解决方案,您可以查看this nice answer。
https://stackoverflow.com/questions/13310941
复制相似问题