Tag: 哈斯克尔

混合Erlang和Haskell

如果你已经购买了函数式编程范例,那么你很可能喜欢Erlang和Haskell。 两者都具有纯粹的function核心和其他优点,如轻量级线程,使其非常适合多核世界。 但是也有一些差异。 Erlang是经过商业validation的具有成熟分布模型的容错语言。 它具有看似独特的function,能够通过热代码加载在运行时升级其版本。 (太棒了!) 另一方面,Haskell拥有任何主stream语言中最复杂的types系统。 (我把'主stream'定义为任何具有已发表的O'Reilly书籍的语言,所以哈斯克尔就是这样评价的)。它的直线单线程性能看起来比Erlang更好,轻量级线程看起来更轻。 我正试图为我剩下的编码生活组build一个开发平台,并想知道是否可以将Erlang和Haskell混合起来,以实现最佳的平台。 这个问题有两个部分: 我想使用Erlang作为一种容错MPI来将GHC运行时实例粘合在一起。 每个GHC运行时将会有一个Erlang进程。 如果“不可能发生”和GHC运行时间死了,那么Erlang进程会以某种方式检测到并死掉。 Erlang的热门代码加载和分发function将继续工作。 可以将GHC运行时configuration为仅使用一个核心,或者本地机器上的所有核心,或两者之间的任何组合。 一旦编写了Erlang库,其余的Erlang级别代码应该是纯粹的样板,并在每个应用程序的基础上自动生成。 (也许通过一个Haskell DSL例如。)如何实现至less一些这些东西? 我希望Erlang和Haskell能够共享相同的garabage收集器。 (这是比1更进一步的想法。)运行在JVM和CLR上的语言通过共享运行时间实现更大的质量。 我明白,在JVM或CLR上运行Erlang(热代码加载)和Haskell(更高版本的多态)有技术限制。 但是,解开垃圾收集器呢? (对函数式语言的运行时间的开始进行sorting)分配显然还是要非常快,所以也许这一点需要静态链接。而且应该有一些机制来区分可变堆和不可变堆(包含懒惰的一次写入内存),因为GHC需要这个。 修改HIPE和GHC是否可行,以便垃圾收集者可以共享堆? 请回答任何经验(积极或消极),想法或build议。 事实上,任何反馈(短直滥用!)是受欢迎的。 更新 感谢所有4个回复date – 每个教我至less有一个有用的东西,我不知道。 关于编码生活的其余部分 – 我把它包含在脸颊中引起争论,但实际上是这样。 我有一个项目,我打算继续努力,直到我死,它需要一个稳定的平台。 在上面提出的平台中,我只会编写Haskell,因为Erlang将自动生成。 那么Haskell会持续多久呢? Lisp依然和我们在一起,看起来好像很快就会消失。 Haskell是BSD3开放源代码,已经达到临界质量。 如果编程本身仍然是50年左右的时间,那么我认为Haskell或者Haskell的一些持续发展仍然会在这里。 更新2 回应rvirding的post 同意 – 实现一个完整的“Erskell / Haslang”通用虚拟机可能不是绝对不可能的,但是确实会非常困难。 虽然垃圾收集器级别只是像虚拟机一样共享,虽然仍然困难 ,但对我来说听起来要难一些。 在垃圾收集模型中,函数式语言必须有很多共同之处 – 不可变数据(包括thunk)的非普遍性和对非常快的分配的要求。 因此,通用性与单一虚拟机紧密捆绑的事实似乎有些奇怪。 VM有助于实现临界质量。 只要看看F#和Scala等“精简”function语言是如何起飞的。 Scala可能不具有Erlang的绝对容错能力,但是它为与JVM绑定的很多人提供了一条逃生路线。 […]

为什么recursion“让”使空间有效率?

我在学习function反应式编程的时候发现了这个说法,从刘海和Paul Hudak的“用箭头塞住空间泄漏” (第5页): Suppose we wish to define a function that repeats its argument indefinitely: repeat x = x : repeat x or, in lambdas: repeat = λx → x : repeat x This requires O(n) space. But we can achieve O(1) space by writing instead: repeat = λx → let xs = x : […]

如何Haskell尾recursion工作?

我写了这段代码,我假设len是尾recursion的,但仍然会发生堆栈溢出。 哪里不对? myLength :: [a] -> Integer myLength xs = len xs 0 where len [] l = l len (x:xs) l = len xs (l+1) main = print $ myLength [1..10000000]

Haskell中的undefined和Java中的null有什么区别?

两者都是术语的types是所有types的交集(无人居住)。 两者都可以在代码中传递,而不会失败,直到试图评估它们。 我可以看到的唯一区别是,在Java中,有一个漏洞,允许null被评估为一个操作,这是参考相等比较( == ) – 而在哈斯克尔undefined根本不能被评估没有投掷一个例外。 这是唯一的区别吗? 编辑 我真正想要解决这个问题的是,为什么在Java中包含null这样一个显然很差的决定,Haskell如何逃避它呢? 在我看来,真正的问题是你可以用null做一些有用的事情,即你可以检查它是否为null 。 因为您可以这样做,所以在代码中传递null值并使它们指示“无结果”而不是“此程序中存在逻辑错误”已成为标准惯例。 而在Haskell中,没有办法检查一个术语是否评估到底而没有对它进行评估,程序是否爆炸,所以它永远不能用来表示“没有结果”。 相反,我们不得不使用像Maybe这样的东西。 对不起,如果看起来我玩的是“评估”这个词,那么我就玩得很快,而且我也试图在这里作一个比喻,并且无法精确地expression出来。 我想这是一个类比不精确的迹象。

Monad与Join()而不是Bind()

Monads通常会被解释为return和bind 。 不过,我收集你也可以通过join (和fmap ?)来实现bind 在缺乏一streamfunction的编程语言中, bind使用起来非常尴尬。 join ,另一方面,看起来相当容易。 但是,我并不完全确定我明白join方式。 显然,它有[Haskell]types join :: Monad m => m(mx) – > mx 对于单子列表,这是平凡而明显的concat 。 但是对于一般的monad来说,这个方法实际上在做什么呢? 我看到它对types签名有什么作用,但是我想弄清楚如何在Java或类似语言中写这样的东西。 (其实,这很容易:我不会,因为generics被打破了;-)但原则上这个问题仍然存在…) 哎呀。 看起来这已经被问到过了: Monad连接function 有人可以使用return , fmap和join来概述常见monads的一些实现吗? (也就是说,根本不提>>= 。)我认为也许这可能会帮助它沉入我的愚蠢的大脑中。

理解Haskell中的箭头

我一直试图抓住箭头,因为他们是大多数玻璃钢实施的基础。 我想我理解了这个基本思想 – 它们与单子有关,但是在每个绑定操作符中存储静态信息,这样你就可以通过一连串箭头来查看静态信息,而无需评估整个箭头。 但是,我们开始讨论第一,第二和交换的时候,我迷失了方向。 二元组与箭头有什么关系? 教程提出了元组的东西,好像它是一个明显的下一步,但我没有真正看到连接。 对于这个问题,箭头语法是什么意思?

简单的例子来说明类别,Monoid和Monad?

我对这三个概念非常困惑。 有没有简单的例子来说明Category,Monoid和Monad之间的区别? 如果有这些抽象概念的例证,这将是非常有帮助的。

如果package-conf和源path都包含它,GHCI将无法加载模块

我在GHCI遇到一个奇怪的情况,不知道有没有人观察过类似的情况。 对于某些模块,当我在searchpath中使用-package -package-conf和-i ,当我尝试导入带有'module is not loaded: FooModule'的模块时,GHCI失败。 :module加载它很好 或者我可以这样做:load FooModule , :m清除导入列表,然后import FooModule 或者我可以从-i删除path,然后导入罚款 跟踪这是在GHC , otherwise modulePackageId = this_pkg (我不知道的意思) otherwise -> modNotLoadedError m loc情况。 这不是完全系统的,有一些模块在包和源path中,但是可以导入。

为什么seq不好?

Haskell有一个名为seq的神奇函数,它接受任何types的参数并将其减less为弱头范式 (WHNF)。 我已经读了几个消息来源(不是我现在能记得他们是谁……),声称“多态性seq是坏的”。 他们以什么方式“坏”? 类似地,还有rnf函数,它将参数减less到Normal Form (NF)。 但这是一个类方法; 它不适用于任意types。 对我来说,似乎是“显而易见的”,可以改变语言规范,将其作为内置原语提供,类似于seq 。 这大概会比只有seq更“糟糕”。 这是怎样的? 最后,有人build议给seq , rnf , par和类似于id函数的types,而不是const函数,因为它现在是一个改进。 怎么会这样?

ghciconfiguration文件

我在Ubuntu上使用ghci 6.8.2。 ghci使用configuration文件,我们可以做一些初始设置? 例如:: :set prompt "ghci> " 。