Tag: 哈斯克尔

什么是更高性能? Haskell或OCaml

我花了18个月的时间来掌握函数式编程,从学习OCaml开始,几个星期之后,Haskell开始了。 现在我想进行下一步并实现一些实际的应用程序:一个简单的实时地形编辑器。 我写了大量的实时地形渲染引擎,所以这是一个熟悉的话题。 而使用的recursionalgorithm和数据结构似乎非常适合于function实现。 随着这是一个实时应用程序,我自然而然地寻找我可以得到的最佳性能。 现在一些(恕我直言,非常恼人的)OCaml的支持者相对于OCaml或者F#来说,相对于Haskell来说相当慢。 但根据计算机语言基准游戏, Haskell经常击败OCaml,即使只有相当小的分数 – 仍然存在问题,这个基准只采取非常具体的样本。 正确的做法当然是用两种语言来实现这个程序,然后比较一下,但是我根本不想做双重工作。 但也许其他人在OCaml和Haskell做了类似的应用程序,并给出一些数字?

Haskell中的2个列表的笛卡尔积

我希望在Haskell中生成2个列表的笛卡尔积,但是我不知道如何去做。 笛卡尔产品给出了列表元素的所有组合: xs = [1,2,3] ys = [4,5,6] cartProd :: [a] -> [b] -> [(a,b)] cartProd xs ys ==> [(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)] 这不是一个真正的家庭作业问题,并不涉及任何这样的问题,但解决这个问题的方式可能有助于一个我坚持。

哈斯克尔($)是一个魔术师?

说我有以下function: infixr 0 <| {-# INLINE (<|) #-} (<|) :: (a -> b) -> a -> b f <| x = fx foo :: a -> (forall b. b -> b) -> a foo xf = fx 以下不input检查: ghci> foo 3 <| id Couldn't match expected type `forall b. b -> b' with actual type […]

为什么没有关于Haskell(与Scala或C#相对)的协变和反变化的讨论?

我知道什么types的协变和逆变。 我的问题是为什么我在研究Haskell(而不是Scala)时还没有遇到这些概念的讨论? Haskell的视图types与Scala或C#相比有一个根本的区别,我想说明一下这个区别是什么。 或者,也许我错了,我只是没有足够的Haskell学习:-)

Haskell中优先级队列实现的比较

Haskell似乎有几个可用的优先级队列实现。 例如,有: Data.PriorityQueue.FingerTree(在fingertree-0.0.1.0上hackage) Data.PurePriorityQueue(在纯粹的优先级队列0.14在hackage) 这两者似乎都是纯粹的优先队列数据结构。 前者是基于手指树,这是我不熟悉的数据结构; 后者是Data.Map的一个包装。 还有 Data.Heap(在堆 – 1.0.0 hackage) 它定义了纯粹function性的堆数据结构,从这些数据结构中可以轻而易举地创build优先级队列。 。 还有 Data.Heap(在hackage中为0.2 ) Data.MeldableHeap(在haldage的meldable-heap-2.0.3中) 它们都使用Brodal / Okasaki数据结构来实现纯function性的可堆栈堆,我相信它类似于非纯function域中的二项堆数据结构。 (哦,还有 Data.PriorityQueue(在优先队列-0.2.2上的hackage) 其function对我来说是不清楚的,但似乎与build立monad的优先级队列有关,而且似乎无论如何都是build立在Data.Map之上的。 在这个问题中,我关心的是纯粹的function优先级队列,所以我认为priority-queue-0.2.2包是无关紧要的。 但如果我错了,请纠正我的错误!) 我需要一个纯粹的function优先级队列数据结构为我正在build设的项目。 我想知道是否有人可以提供任何智慧的话,因为我决定在黑客提供的财富尴尬之间。 特别: 假设我想要除了传统的优先级队列插入和extract-min操作之外的function,在纯function/不可变的演示文稿中。 上面提到的软件包有什么优点和缺点? 有没有人有经验使用他们的任何“愤怒”? 性能的折衷是什么? 可靠性? 哪些被其他人广泛使用? (使用这些可能会使我的代码更容易被他人阅读,因为他们更可能熟悉图书馆。)在作出决定之前,我还需要了解其他什么吗? 如果我也想要高效的合并优先级队列,那么呢? (我不是为了这个项目,但是我认为增加这个,但是会让这个问题对于未来的读者更有用。) 有没有其他优先级队列包,我错过了?

什么是箭头,我怎样才能使用它们?

我试图学习箭的意思,但我不明白他们。 我使用了Wikibooks教程。 我认为维基教科书的问题主要在于它似乎是为那些已经了解这个主题的人写的。 有人可以解释什么是箭头,我怎样才能使用它们?

使用Haskell状态monad的代码味道?

上帝我讨厌“代码味道”这个词,但我想不出更准确的东西。 在空闲时间,我正在devise一个高级语言和编译器,以便学习编译器构造,语言devise和函数式编程(编译器正在用Haskell编写)。 在编译器的代码生成阶段,我必须在遍历语法树时维护“状态”数据。 例如,编译stream程控制语句时,我需要为要跳转的标签生成唯一的名称(从传入,更新和返回的计数器生成的标签,并且计数器的旧值不能再次使用)。 另一个例子是当我在语法树中遇到内联string文字时,他们需要永久转换成堆variables(在空白string中最好存储在堆中)。 我目前正在包装整个代码生成模块在状态monad来处理这个。 我被告知编写一个编译器是一个非常适合于function范例的问题,但是我发现我的devise方式与C中的devise方式非常相似(你可以用任何语言编写C语言 – 甚至Haskell w /状态monads)。 我想学习如何在Haskell中思考(而不是在函数范式中) – 而不是在Haskell语法中使用C语言。 我应该真的试图消除/最小化使用状态monad,还是它是一个合法的function“devise模式”?

应用性parsing与单体parsing有什么好处?

似乎有一个共识,你应该使用Parsec作为应用而不是monad。 应用性parsing与单体parsing有什么好处? 样式 性能 抽象化 monadicparsing出来了吗?

绑定FFI和DSL

在Haskell LLVM绑定中 ,我试图用可变数量的参数定义一个函数(实际上我是指在编译时不知道的常量)。 我发现这个问题 ,我正在试着回答。 我不想完全回退使用FFI来生成LLVM,我想尽可能多地使用DSL,并使用FFI来做我不能通过DSL做的事情。 我设法通过functionType定义一个types,我仍然无法添加一个函数调用defineModule创build一个模块。 我也认为下一步是通过FFI.appendBasicBlock来添加基本块,我认为这很容易,但是我怎样通过CodeGenFunction monad中的do块内的CodeGenFunction获取参数。

有趣的重复的fmap

我正在玩function游戏,我注意到一些有趣的事情: 普通的id可以在types(a -> b) -> a -> b实例化。 使用列表函子,我们有fmap :: (a -> b) -> [a] -> [b] ,它与map相同。 在((->) r)函子(来自Control.Monad.Instances )中, fmap是函数组合, fmap fmap fmap :: (a -> b) -> [[a]] -> [[b]] ,相当于(map . map) 。 有趣的是, fmap八次给了我们(map . map . map) fmap (map . map . map) ! 所以我们有 0: id = id […]