Questions tagged «algebraic-data-type»

7
您如何用C#或类似Java的语言编码代数数据类型?
代数数据类型很容易解决一些问题,例如,列表类型可以非常简洁地表示为: data ConsList a = Empty | ConsCell a (ConsList a) consmap f Empty = Empty consmap f (ConsCell a b) = ConsCell (f a) (consmap f b) l = ConsCell 1 (ConsCell 2 (ConsCell 3 Empty)) consmap (+1) l 这个特定的例子在Haskell中,但是在其他语言中,本机支持代数数据类型,这将是相似的。 事实证明,有一个明显的面向对象样式子类型的映射:数据类型成为抽象基类,每个数据构造函数都成为具体的子类。这是Scala中的示例: sealed abstract class ConsList[+T] { def map[U](f: T …

1
面向单分配ADT的代码在现代CPU上的性能
可以推论,使用单一分配处理不可变数据具有明显的效果,那就是需要更多的内存,因为您一直在创建新的值(尽管在幕后的编译器会做一些指针技巧来解决这一问题)。 但是,我现在已经听到几次,性能方面的损失被CPU(特别是其内存控制器)可以利用内存未发生突变(这种情况不多)这一事实带来的收益所抵消。 我希望有人可以阐明这是如何做到的(或者如果不是的话)。 在另一篇文章的评论中,有人提到抽象数据类型(ADT)与此有关,这使我更加好奇,ADT如何特别影响CPU处理内存的方式?不过,这是一个问题,主要是我只是对语言的纯洁度如何必然影响CPU及其缓存的性能等感兴趣。

3
代数数据类型可以解决什么问题?
公平的警告,我是函数编程的新手,所以我可能有很多错误的假设。 我一直在学习代数类型。许多功能语言似乎都有它们,它们在与模式匹配一​​起使用时非常有用。但是,他们实际上解决了什么问题?我可以像这样在C#中实现一个看似(排序)的代数类型: public abstract class Option { } public class None : Option { } public class Some<T> : Option { public T Value { get; set; } } var result = GetSomeValue(); if(result is None) { } else { } 但是我认为大多数人都同意这是面向对象编程的混蛋,您永远都不要这样做。那么函数式编程是否只是添加了一种更简洁的语法,从而使这种编程风格看起来不太那么粗拙?我还想念什么?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.