Questions tagged «haskell»

一种功能编程语言

6
是什么使Haskell类型系统如此受人尊敬(相对于Java)?
我开始学习Haskell。我对此很陌生,我只是在阅读一些在线书籍,以了解其基本结构。 熟悉它的人经常谈论的“模因”之一就是整个“如果它可以编译,它将可以工作*”的东西-我认为这与类型系统的强度有关。 我试图理解为什么Haskell在这方面到底比其他静态类型的语言要好。 换句话说,我假设在Java中,您可以做一些令人讨厌的ArrayList<String>()事情,例如埋葬, 以包含确实应该包含的内容ArrayList<Animal>()。这里令人讨厌的事情是您的stringcontains elephant, giraffe等,如果有人放进去,Mercedes您的编译器将无法为您提供帮助。 如果这样做了,ArrayList<Animal>()那么在以后的某个时间点,如果我确定我的程序不是真正的关于动物的,而是关于车辆的,那么我可以更改,例如产生ArrayList<Animal>生产的功能,ArrayList<Vehicle>而我的IDE应该告诉我那里的所有地方是一个编译中断。 我的假设是,这就是人们所说的强类型系统的含义,但是对我而言,为什么Haskell的更好才是显而易见的。换句话说,您可以编写好的Java或坏的Java,我假设您可以在Haskell中执行相同的操作(即,将东西填入字符串/整数中,它们实际上应该是一流的数据类型)。 我怀疑我缺少重要/基本的东西。 我很高兴能向我展示我的方式的错误!



4
箭头的目的是什么?
我正在通过Haskell学习函数式编程,并且尝试通过首先理解为什么需要它们来抢占概念。 我想知道功能编程语言中箭头的目标。他们解决什么问题?我检查了http://en.wikibooks.org/wiki/Haskell/Understanding_arrows和http://www.cse.chalmers.se/~rjmh/afp-arrows.pdf。我所了解的是,它们用于描述计算图,并且它们允许更轻松的无点样式编码。 本文假定无点样式通常更易于理解和编写。这对我来说似乎很主观。在另一篇文章(http://en.wikibooks.org/wiki/Haskell/StephensArrowTutorial#Hangman:_Main_program)中,实施了子手游戏,但是我看不到箭头如何使这种实现自然而然。 我可以找到许多描述该概念的论文,但没有找到动机。 我缺少什么?

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
您如何用Haskell或其他功能编程语言设计程序?
我在面向对象的编程语言(例如C#或ruby)方面有一些经验。我知道如何设计面向对象风格的程序,如何创建类和对象,以及如何定义它们之间的关系。我也知道一些设计模式。 人们如何编写功能程序?他们如何开始?有功能语言的设计模式吗?极限编程或敏捷开发等方法是否适用于功能语言?

5
Haskell是否有缺点或问题?
我正在考虑进入Haskell进行下一个(相对琐碎的)个人项目。我处理Haskell的原因是: 让我沉迷于纯粹的功能语言 速度。虽然我可以肯定这是有争议的,但分析表明我发现Haskell接近C ++(并且似乎比Erlang快很多)。 速度。与几乎所有其他服务器相比, Warp Web服务器似乎快疯了。 因此,鉴于此,我正在寻找的是Haskell带来的弊端或问题。Web上有大量有关Haskell为什么是一件好事的信息,但是我没有找到很多有关其丑陋方面的主题(除了对语法的牢记,我根本不在乎)。 我正在寻找的示例可能像Python的GIL。直到我真正开始考虑在CPython环境中使用并发性时,这些事情才浮出水面。
47 haskell 

5
批评IO monad被视为在世界上运作的州monad
IOHaskell中的单子通常被解释为州是世界的州单子。因此,将IO amonad 类型的值视为worldState -> (a, worldState)。 前一段时间,我读了一篇文章(或博客/邮件列表帖子),该文章批评了这种观点,并提出了一些不正确的原因。但是我既不记得这篇文章,也不记得原因。有人知道吗 编辑:这篇文章似乎丢失了,所以让我们在这里开始收集各种参数。 我开始悬赏以使事情变得更有趣。 编辑:该文章中,我一直在寻找的应对尴尬的阵容:单子输入/输出,并发性,异常和外国语言的Haskell中调用由西蒙·佩顿-琼斯。(感谢TacTics的回答。)

2
为什么(或为什么不这样)存在性类型在函数式编程中被认为是不好的做法?
我可以使用哪些技术来一致地重构代码,以消除对存在类型的依赖?通常,这些用于取消您不希望使用的类型的构造的资格,并允许在对给定类型有最少了解的情况下进行消耗(或者我的理解是这样)。 有没有人想出一种简单而一致的方法来消除对代码中这些内容的依赖,而这些代码仍然保留了一些好处?还是至少有任何一种滑入抽象的方式,使得它们可以删除而无需大量的代码改动来应对这种变更? 您可以在此处阅读有关存在性类型的更多信息(“如果您敢..”)。

3
使用LISP和Haskell有什么优势?他们会让我成为更好的程序员吗?[关闭]
我知道Lisp和Haskell分别是逻辑和函数编程语言,但这到底意味着什么?它们与其他语言有何不同?我听说学习这些将使您成为一个更好的程序员并改善您的逻辑。这是真的,如果我学习Lisp或Haskell达到了能干的水平,我的编程会得到改善,并且我会更好地处理任何语言的问题吗?我只是想知道看看它们是否值得学习。这些语言在GUI和图形等领域是否有用,还是仅对控制台应用程序有用?
41 haskell  lisp 


2
对纯函数式语言的误解?
我经常遇到以下语句/参数: 纯函数式编程语言不允许有副作用(因此在实践中很少使用,因为任何有用的程序的确有副作用,例如,当它与外界交互时)。 纯函数式编程语言不允许编写维护状态的程序(这使编程变得很尴尬,因为在许多应用程序中您确实需要状态)。 我不是功能语言方面的专家,但是到目前为止,这是我对这些主题的了解。 关于第1点,您可以使用纯函数式语言与环境进行交互,但是必须显式标记引入副作用的代码(函数)(例如,在Haskell中通过单子类型)。而且,据我所知,即使不是首选工作方式,也应该可以进行副作用计算(破坏性地更新数据)(使用monadic类型?)。 关于第2点,据我所知,您可以通过几个计算步骤(在Haskell中,再次使用monadic类型)对值进行线程化来表示状态,但是我没有这样做的实践经验,我的理解还很模糊。 那么,以上两个陈述在任何意义上是正确的还是仅仅是对纯函数式语言的误解?如果是误解,它们是怎么产生的?您能写一个(可能很小的)代码片段来说明Haskell惯用的方式来(1)实现副作用和(2)实现有状态的计算吗?

2
现代语言是否仍使用解析器生成器?
我是研究关于gcc编译器套件在维基百科这里,当这想出了: GCC开始使用由Bison生成的LALR解析器,但后来逐渐切换为手写递归下降解析器。2004年用于C ++,2006年用于C和Objective-C。目前,所有前端都使用手写递归下降解析器 因此,在最后一句话中,(以及我所信任的维基百科),我可以肯定地说:“ C(gcc),C ++(g ++),Objective-C,Objective-C ++,Fortran(gfortran),Java(gcj), Ada(GNAT),Go(gccgo),Pascal(gpc),... Mercury,Modula-2,Modula-3,PL / I,D(gdc)和VHDL(ghdl)”都是前端,不再使用解析器生成器。也就是说,它们都使用手写的解析器。 我的问题是,这种做法无处不在吗?具体来说,我在[Python,Swift,Ruby,Java,Scala,ML,Haskell]中寻找x的“ x的标准/官方实现是否具有手写的解析器”的确切答案?(实际上,这里也欢迎提供其他语言的信息。)我敢肯定,经过大量的挖掘,我可以自己找到它。但是,我也相信社区很容易对此负责。谢谢!

5
“证明是程序;它证明的公式是程序的类型”
这可能是哲学上的问题,但我相信对此有一个客观的答案。 如果您阅读有关Haskell的维基百科文章,则可以找到以下内容: 该语言源于Haskell Curry及其知识分子后代的观察,即“证明是程序;它证明的公式是程序的类型”。 现在,我要问的是:这真的不适用于几乎所有的编程语言吗?Haskell的哪些功能(或一组功能)使其符合此声明?换句话说,此语句影响语言设计的主要方式是什么?
37 haskell 

7
强制性break语句和其他循环检查的功能等效项是什么?
假设我具有以下逻辑。如何在函数式编程中编写它? public int doSomeCalc(int[] array) { int answer = 0; if(array!=null) { for(int e: array) { answer += e; if(answer == 10) break; if(answer == 150) answer += 100; } } return answer; } 大多数博客,文章中的示例……我看到的只是解释了一个简单的数学函数“ Sum”的简单例子。但是,我有一个类似于以上用Java编写的逻辑,并且希望将其迁移到Clojure中的功能代码。如果我们无法在FP中执行上述操作,则FP的促销方式不会明确说明这一点。 我知道上面的代码是绝对必要的。编写此程序并非出于将来将其迁移到FP的考虑。

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.