类型的替代?

ahm*_*ari 12 f# haskell functional-programming typeclass

哈斯克尔程序员.使用F#.F#中没有类型类.什么时候我需要类型类?

Bri*_*ian 20

请按照某人的建议查看此信息.

我认为简短的回答是通过操作词典(正如Haskell所说的那样;实例的证人).

或者更改设计,这样就不需要类型类.(这总是让人感到痛苦,因为类型组是有史以来最好的东西而且很难让它们落后,但是在Haskell和类型类出现之前,人们仍然设法在没有类型类的情况下以某种方式编程了40年,所以那些人做了同样的事情.)

您还可以通过inline静态成员约束获得一些方法,但这很快就会变得难看.

这是一个操作字典示例:

// type class
type MathOps<'t> = { add : 't -> 't -> 't; mul: 't -> 't -> 't }  //'

// instance
let mathInt : MathOps<int> = { add = (+); mul = (*) }

// instance
let mathFloat : MathOps<float> = { add = (+); mul = (*) }

// use of typeclass (normally ops would the 'constraint' to the left of 
// the '=>' in Haskell, but now it is an actual parameter)
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)
Run Code Online (Sandbox Code Playgroud)

  • @Jon Harrop:什么?当然如此.定义类型类和实例与定义类型完全分开.他们甚至不必在同一个模块中.如果内存为我服务,Scala的版本更强大,让你有本地范围的定义(但我不知道Scala,所以我可能会感到困惑). (14认同)
  • @Jon Monad超载? (7认同)
  • 似乎还有另一个没有提到的问题,它不仅仅是缺少类型类.事实上,F#(因为.NET)不支持更高级别的多态性,这意味着你不能(通常)在Haskell等语言中实现一些可能的抽象,即使使用显式字典传递也无法做到.我真的希望将来在.NET/F#中进行整理. (6认同)
  • @Jon当然是.Monads不仅仅适用于你知道的副作用. (4认同)
  • @Jon Harrop - 静态解析类型类 (3认同)
  • @Jon Harrop:所以你不是F#中计算表达的粉丝,我接受了吗? (3认同)
  • 当然.我经常使用`replicateM`来读取标准输入的整数列表(`replicateM 5(readLn :: IO Integer)`)或生成给定长度的所有可能的布尔字符串(`replicateM 5 [False,True] ]`).如果在后一种情况下我后来决定用更有效的非确定性monad替换list monad,我不想重写`replicateM`. (3认同)
  • @camccann对于记录,是的,Scala允许您在本地范围定义.然而,使用起来更尴尬,目前类型类的库使用很少.希望这两件事情都能在未来得到解决. (2认同)
  • 字典传递是类型类的一种实现,它不是唯一的方法.JHC编译器是(整个程序优化)Haskell编译器的一个示例,它不使用字典传递来实现类型类. (2认同)
  • 放弃吧伙计们,乔恩就是乔恩。无论何时何地,他总是对的。:-) 在你接受这一点之前,他不会停止争论。 (2认同)