Questions tagged «haskell»

一种功能编程语言

2
Haskell委员会为什么选择monad代表I / O?
该清洁语言使用的独特类型来处理I /在一个单纯的功能设置O操作。为什么Haskell委员会改为使用monads?是否还有其他提议处理该委员会调查但决定反对的状态? 注意:我并不是在寻找Monad与其他形式的计算之间的圣战。让我们仅根据委员会在I / O方面的选择来讨论主题。

12
Scheme与Haskell进行函数式编程简介?
我对使用C和C#编程感到满意,并且将来会探索C ++。我可能对将函数式编程作为一种不同的编程范例进行研究感兴趣。我这样做很有趣,我的工作不涉及计算机编程,并且在大学的计算机科学课程中就很早就开始使用函数式编程,这在某种程度上受到了启发。Lambda微积分当然超出了我的数学能力,但是我认为我可以处理函数式编程。 Haskell或Scheme中的哪一个可以很好地介绍函数式编程?我将emacs用作文本编辑器,并希望将来能够更轻松地对其进行配置,这需要学习Emacs Lisp。但是,我的理解是Emacs Lisp与Scheme完全不同,并且在功能性方面也更具程序性。 如果我追求Scheme,我可能会使用已经购买的“ The Little Schemer”书(我有限的翻阅对我来说似乎有些不可思议)。或者,如果我追求Haskell,可以使用“向您了解Haskell的伟大成就”。我还将在第9频道上观看Erik Meijer博士的Haskell简介视频。 任何建议,反馈或意见表示赞赏。 谢谢。 PS BTW由于我拥有用于​​C#开发的Visual Studio 2010,因此我也可以使用F#,但是我认为这不是我选择语言的主要标准。

7
Haskell的类型系统是理解函数式编程的障碍吗?[关闭]
我正在研究Haskell,目的是理解函数式编程,并期望我将应用在其他语言(主要是Groovy,Python,JavaScript)中获得的见解。 我之所以选择Haskell,是因为我有一个印象,那就是它纯粹是功能性的,不会允许任何对状态的依赖。 我没有选择学习Haskell,因为我对导航一个非常严格的类型系统感兴趣。 我的问题是:强类型系统是否是一种极其纯净的功能语言的必要副产品,还是这与Haskell无关的设计选择?

2
将指称语义学应用于程序设计
我已经读过一些有关指称语义(DS)的文章,并且对设计计算机程序的过程非常感兴趣,在计算机程序中,类型和功能与数学之间有着牢固而清晰的映射。 是否有任何资源详细讨论了基于DS的设计程序?我已经看到了对该主题的一些表面处理。 我精通Haskell,Scala,Common Lisp和一些Scheme,因此使用这些语言的任何资源都将受到赞赏。
30 scala  haskell  scheme 

8
惰性评估的概念为何有用?
表达式的惰性求值似乎会使程序员失去对代码执行顺序的控制。我很难理解为什么程序员会接受或期望这样做。 当我们无法保证将在何时何地评估表达式时,该范式如何用于构建可预期运行的可预测软件?

3
Web服务的Haskell vs Erlang
我正在尝试使用一种功能语言来开始一个实验项目,并试图在Erlang和Haskell之间做出选择,而这两点我都非常喜欢。 我喜欢Haskell强大的字体系统和纯正的风格。我有一种感觉,它将使编写真正可靠的代码变得更加容易。而且我认为Haskell的强大功能将使我想做的事情变得容易得多。 不利的一面是,我觉得在Haskell上做Web东西的某些框架(例如Yesod)不如其Erlang计数器部分那么先进。 我更喜欢Erlang的线程和容错方法。我觉得Erlang的可伸缩性可能是一个主要优点。 这就引出了我的问题,人们在Haskell和Erlang中实现Web应用程序后端有什么经验。Haskell是否有软件包提供Erlang中一些轻量级线程和actor?

8
例如,对于大型Web应用程序,在现实世界中使用“强”类型系统吗?
我知道这是一个非常广泛,模棱两可甚至是哲学上的问题。在某种程度上,问题中最重要的关键字-“强”类型系统-本身定义不正确。所以,让我尝试解释我的意思。 问题的总体背景 我们已经在Ruby on Rails中构建了一个非常大型的Web应用程序,并且总体上我们对我们的堆栈感到满意。如果需要的话,我们可以非常快速地发货-可以在90%的“业务”案例中使用,而不必担心10%的边缘案例。另一方面,借助代码审查和测试覆盖率,我们可以缓慢而谨慎地进行,并确保覆盖所有基础-再次,仅在需要进行更仔细检查和安全的情况下。 但是,随着团队的壮大,我开始感到不舒服,因为缺少直接放入我们堆栈中的“安全网”。 我们最近开始在Java上进行一些本机Android开发。我(愉快地)想起了编译/静态/强类型语言提供的安全性。 IDE本身会捕获错误拼写的变量,错误的数据类型,错误的函数调用以及许多琐碎的错误。全部是因为IDE可以挂接到编译器并验证程序“正确性”的某些方面。 是否需要更改功能签名?简单。编译器+ IDE可以帮助您发现所有调用站点。 是否需要确保始终处理某些异常?已检查的救援例外情况。 现在,尽管这些安全功能各有优点,但我也很清楚它们的缺点。更重要的是,在“繁重的” Java世界中。因此,代替Java,我开始研究人们近来开始使用的大量现代“强类型”语言。例如:Scala,Rust,Haskell等。我最感兴趣的是它们的类型系统和静态/编译时检查的功能。 现在,问题 如何在大型应用程序中使用这些功能强大的类型系统和静态/编译时功能? 例如,对于这些强大的功能,我将如何超越标准的“ hello world”介绍?使用富类型系统来建模业务域问题的模型吗?当您位于30,000 LOC +区域中时,类型系统会帮助还是阻碍?当您的系统与弱类型的外部环境交互时,这些类型的系统(和编译时检查)所提供的安全网会如何处理?通过JSON或XML API,各种数据存储,用户输入等。

3
查看单子的不同方法
在学习Haskell的过程中,我遇到了很多教程,试图解释什么是monad,以及为什么monad在Haskell中很重要。他们每个人都使用类比,因此更容易理解其含义。归根结底,我对单子是3种不同的看法: 查看1:将Monad作为标签 有时我认为将monad作为特定类型的标签。例如,一个类型的函数: myfunction :: IO Int myfunction是一个函数,无论何时执行它都会产生一个Int值。结果的类型不是Int,而是IO Int。因此,IO是Int值的标签,警告用户知道Int值是执行IO操作的过程的结果。 因此,此Int值已被标记为来自具有IO的过程的值,因此该值为“脏”。您的过程不再是纯粹的。 视图2:莫纳德(Monad)是可能发生令人讨厌的事情的私人空间。 在所有过程都是纯且严格的系统中,有时您需要产生副作用。因此,monad只是一个很小的空间,允许您做讨厌的副作用。在这个空间中,您可以逃脱纯净的世界,走不纯净的事物,进行过程,然后返回有价值的东西。 图3:Monad的范畴论 我不完全理解这种观点。monad只是同一类别或子类别的函子。例如,您具有Int值,并且作为IO Int子类,它们是在IO过程之后生成的Int值。 这些观点正确吗?哪个更准确?

4
Haskell中的return-type-only only多态性好吗?
在Haskell中我从未完全了解过的一件事是如何拥有多态常量和函数,这些常量和函数的返回类型不能由其输入类型确定,例如 class Foo a where foo::Int -> a 我不喜欢这样的一些原因: 参照透明度: “在Haskell中,给定相同的输入,一个函数将始终返回相同的输出”,但这是真的吗?read "3"在Int上下文中使用时返回3 ,但在上下文中使用时抛出错误(Int,Int)。是的,您可以说这read也是一个类型参数,但是我认为类型参数的隐式性使其失去了某些美感。 单态限制: 关于Haskell的最烦人的事情之一。如果我错了,请纠正我,但是MR的全部原因是看起来共享的计算可能不是因为type参数是隐式的。 输入默认值: 再次是Haskell上最烦人的事情之一。例如,如果您在输出中将函数多态的结果传递给输入中的函数多态,则会发生这种情况。同样,如果我错了,请纠正我,但是如果没有函数的返回类型不能由其输入类型(和多态常量)确定的函数,则不需要这样做。 因此,我的问题是(冒着被盖章为“讨论问题”的风险):是否有可能在类型检查器不允许这些定义的情况下创建类似于Haskell的语言?如果是这样,该限制的利弊是什么? 我可以看到一些直接的问题: 例如,如果2仅具有type Integer,2/3则将不再使用当前定义进行类型检查/。但是在这种情况下,我认为具有功能依赖性的类型类可以解决(是的,我知道这是一个扩展)。此外,我认为拥有可以采用不同输入类型的函数比拥有受其输入类型限制的函数要直观得多,但是我们只是将多态值传递给它们。 值的打字喜欢[]和Nothing我看来,像一个难啃的骨头。我还没有想到处理它们的好方法。


2
克里斯·冈崎(Chris Okasaki)的1996年论文和1999年的《纯函数数据结构》一书在内容上有什么区别?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 我想阅读纯粹的功能数据结构。我很容易找到论文(可以PDF形式免费获得),但也可以找到一本书。因此,我想知道这两个出版物之间的区别(如果有)。



1
seq在Haskell生产代码中多久使用一次?
我在使用Haskell编写小型工具方面有一些经验,我发现使用起来非常直观,尤其是对于编写过滤器(使用interact)来处理其标准输入并将其通过管道传输到标准输出。 最近,我尝试在比通常大10倍的文件上使用这样的过滤器,但出现Stack space overflow错误。 在阅读了一些内容之后(例如,在这里和这里),我确定了两个节省堆栈空间的准则(有经验的Haskellers,如果我写的东西不正确,请纠正我): 避免使用非尾递归的递归函数调用(这对所有支持尾调用优化的功能语言均有效)。 引入seq强制对子表达式进行早期评估,以使表达式在被缩减之前不会变得太大(这是Haskell所特有的,或者至少是使用惰性评估的语言所特有的)。 seq在我的代码中引入了五到六个调用之后,我的工具再次运行平稳(也适用于较大的数据)。但是,我发现原始代码更具可读性。 由于我不是一位经验丰富的Haskell程序员,所以我想问一下seq以这种方式进行介绍是否是一种常见的做法,以及通常seq在Haskell生产代码中看到该代码的频率。还是有什么技术可以避免使用seq太频繁而仍然只使用很少的堆栈空间?

1
Hindley-Milner推理可以为Go语言工作吗?
我读过Hindley-Milner不适用于具有子类的类型系统,并且还有其他类型系统功能也不能很好地使用它。Go当前在:=运算符中只有非常有限的类型推断。但是Go并没有传统意义上的子类,只有看起来与Haskell的类型类非常相似的接口,可以很好地与Hindley-Milner推理配合使用。 那么,Hindley-Milner推理在原理上是否可以像对Haskell一样进行推论?还是Go具有其他打破它的功能?(另一方面,Haskell还具有某些与Hindly-Milner不兼容的功能,如果要使用这些功能,则必须手动键入程序的那些部分。)

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.