首页 文章

H#中的代数数据类型是否在F#中具有相同的区分联合?

提问于
浏览
20

我正在学习Haskell,并想知道Haskell中已知的代数数据类型是否与F#中的区分联合相同,或者它们之间存在一些细微差别 .

我还非常感谢F#(我的第一个函数式语言)与其他函数式语言之间的良好比较,特别是在类似概念方面,但具有实质性但重要的差异 .

2 回答

  • 4

    (我来自OCaml,但是我查看了相关的F#内容并且看起来是一样的 . 如果我错了,请纠正我 . )它们是相同的,只是对同一事物的不同术语,但是有一些语法差异 . 例如,要定义一个具有多个数据元素的构造函数,在OCaml和F#中,您可以将类型写入,如同它们被填充在元组中一样:

    哈斯克尔:

    data Whatever = Foo TypeA TypeB
    

    OCaml / F#:

    type whatever = Foo of typeA * typeB
    

    类似地,对于模式匹配,您同样就像一个参数,它是一个元组,其中包含所有数据成员:

    哈斯克尔:

    case x of Foo a b -> ...
    

    OCaml / F#:

    match x with Foo (a, b) -> ...
    

    编辑:显然以下内容不适用于F#

    此外,在Haskell中,构造函数自动成为一个函数,您可以像其他任何值一样使用它:
    zipWith Foo xs ys
    OCaml / F#不这样做 . 您可以为每个构造函数手动定义自己的函数 .

  • 9

    我'm not very familiar with Haskell (I' ve只读Learn You a Haskell)但我没有't yet come across a basic difference between DUs and Haskell'代数数据类型 - 他们都试图模拟相同的概念 . 话虽如此,F#和Haskell具有非常不同的类型系统(例如,Haskell具有类型类/更高级的类型; F#在OOP中具有深度基础等),因此存在不对称性,但不限于这些数据类型 .

相关问题