首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >与F#中的Haskell GADT和类型类最接近的是什么?

与F#中的Haskell GADT和类型类最接近的是什么?
EN

Stack Overflow用户
提问于 2012-11-09 23:29:38
回答 2查看 2.4K关注 0票数 8

F#是一种面向对象的ML。它与Haskell广义代数数据类型和类型类最接近的是什么?

EN

回答 2

Stack Overflow用户

发布于 2012-11-10 00:04:45

答案取决于你试图解决的问题。F#没有类型类和GADT,因此没有直接映射。但是,F#有各种机制,您可以使用它们来解决通常在Haskell中使用GADT和类型类解决的问题:

  • 如果你想表示对象结构,并且能够添加具有不同行为的新的具体实现,那么你通常可以使用标准的OO和接口。
  • 如果你想写通用的数字代码,你可以使用静态成员约束(here is an example),从技术上讲,这可能是最接近于类型化的机制。
  • 如果你想编写更高级的通用代码(如通用打印机或解析器),那么你可以经常使用powerful F# runtime reflection pad,你需要通过一组函数(执行代码所需的各种子操作)来参数化代码,然后你可以传递接口的实现,如@pad所示。

还有一种方法可以实现emulate Haskell type classes in F#,但这通常不是一个惯用的F#解决方案,因为F#编程风格在许多方面与Haskell风格不同。它的一个相当标准的用法是定义重载操作符(参见this SO answer)。

在元级别,询问什么是另一种语言中的功能X的等价物通常会导致混乱的讨论,因为X可能用于解决一种语言中的问题A、B、C,而另一种语言可能提供不同的功能来解决相同的问题(或者一些问题可能根本不存在)。

票数 19
EN

Stack Overflow用户

发布于 2012-11-10 00:11:01

在F#中,您经常使用interfacesinheritance来实现这些目的。

为了便于示例,下面是一个使用接口和object expressions的简单类型类

代码语言:javascript
代码运行次数:0
运行
复制
/// 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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13310941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档