Tag: haskell

zip与模拟Python?

Python中Haskell的zipWith函数的模拟是什么? zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]

Haskell:一个不是Functor(或者不可穿越)的Foldable的例子?

一个Foldable实例可能是某种容器,所以也可能是一个Functor 。 事实上, 这就是说 一个Foldabletypes也是一个容器(虽然这个类在技术上并不需要Functor ,有趣的Foldable s都是Functor的)。 那么有没有一个自然是Functor或Traversable的Foldable的例子? (这也许Haskell wiki页面错过了:-))

学习Haskell以学习Scala

我已经阅读了一些问题,例如斯卡拉vs哈斯克尔讨论两种语言的优点或学习,但我已经知道我想学习斯卡拉。 我是uni的Java程序员,现在主要使用PHP。 我想学习Scala,因为它看起来像个人项目的Java改进,我也想学习一个函数式语言来提高我作为程序员的知识。 我想知道是否将Haskell作为函数式编程的入门知识是一个好主意,因为它是纯粹的function性的,所以我会正确地学习它,而不是在Scala中使用一些函数,而不知道为什么? 我也想使用Haskell作为个人项目等,因为它看起来不错,但我真的没有看到它的许多真实世界的应用程序,似乎更多地用于学术的东西,因此想学习它获得function的理解,然后继续前进斯卡拉。

Python比编译好的Haskell更快?

如果您认为这不属于这里,请随意标记为无关紧要。 我有一个用Python和Haskell编写的简单脚本。 它读取一个具有1,000,000换行分隔整数的文件,将该文件parsing成整数列表,快速sorting,然后将其写入到sorting的不同文件中。 这个文件与未sorting的文件格式相同。 简单。 这里是Haskell: quicksort :: Ord a => [a] -> [a] quicksort [] = [] quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater) where lesser = filter (< p) xs greater = filter (>= p) xs main = do file <- readFile "data" let un = lines file let f […]

如何在Haskell项目中使用DLL?

我想在Haskell项目中使用外部库RDFox 。 上下文:我正在使用GHC 7.10和堆栈 ,都是64位的Windows和Linux。 RDFox是用C ++编程的。 RDFox共享库(.dll,.so)可以用Java和Python包装下载。 目标:我想在我的Haskell项目中重用RDFox(.dll,.so)编译的库,所以我需要为RDFox创build一个Haskell包装器。 问题:对于Haskell来说相对较新,我很难知道从哪里开始。 我find了关于这个主题的几个页面(来自Haskell wiki和StackOverflow),但是工作stream和configuration对我来说并不清楚。 问题:我想知道: 如何configuration堆栈和cabal使用外部库,build立在Windows 或 Linux(不同的机器,相同的存储库)。 如何在此外部库上configurationGHCi进行交互式testing。 Python包装器翻译成Haskell是最好的方法吗? 我想避免对RDFox C ++代码的分析。

GHC Haskell目前的约束系统有什么问题?

我听说Haskell的“破坏”约束系统存在一些问题,如GHC 7.6及以下。 它出什么问题了? 是否有一个可比的现有系统克服这些缺陷? 例如,edwardk和tekmo都遇到了麻烦(例如tekmo的这个评论 )。

咖喱霍华德同构

我已经在互联网上search了一遍,我也找不到任何关于“气”的解释,这些解释并没有迅速退化成一个逻辑理论的演讲,而这个逻辑理论在我的脑海中已经大打折扣了。 (这些人认为“直觉主义演算”是一个实际上对于正常人来说意味着什么的短语!) 粗略地说,CHI说types是定理,程序是这些定理的certificate。 但是这到底意味着什么呢? 到目前为止,我已经明白了这一点: 考虑一下id :: x -> x 。 其types表示“鉴于X是真实的,我们可以得出结论X是真实的”。 对我来说似乎是一个合理的定理。 现在考虑foo :: x -> y 。 正如任何Haskell程序员会告诉你的,这是不可能的。 你不能写这个函数。 (好吧,无论如何都不要作弊。)读作为一个定理,它说“假设任何X是真的,我们可以得出结论,任何Y是真的”。 这显然是无稽之谈。 而且,果然,你不能写这个function。 更一般地说,函数的论点可以被认为是“被假定为真的”,结果types可以被认为是“假设所有其他事物都是真的”。 如果有一个函数论证,比如说x -> y ,那么我们可以把这个假设看作X是真的,这意味着Y必须是真的。 例如, (.) :: (y -> z) -> (x -> y) -> x -> z可以被认为是“假设Y意味着Z,X意味着Y,并且X是真实的,我们可以得出结论Z是真的“。 这对我来说似乎是合情合理的。 现在,究竟是什么Int -> Int意思是? O_O 我可以想到的唯一明智的答案是:如果你有一个函数X – > Y – > Z,那么types签名表示“假设可以构造一个Xtypes的值,另一个types为Y,那么有可能构造一个Z型的值“。 […]

有什么理由不使用INLINABLE编译指示function吗?

该文件指出: 函数f上的{ – #INLINABLE f# – } pragma具有以下行为: 虽然INLINE说“请把我列入”,但是INLINABLE说:“随意联系我,使用你的自由裁量权”。 换句话说,select留给GHC,它使用与无杂注函数相同的规则。 与INLINE不同,该决定是在呼叫站点进行的,因此将受到内联阈值,优化级别等的影响。 像INLINE一样,INLINABLE pragma保留了原始RHS的内联目的,并将其保存在接口文件中,而不pipeRHS的大小如何。 使用INLINABLE的一种方法是与内联的特殊function(第7.18节“特殊内置function”)结合使用。 内联调用f很难内联f。 为了确保f可以内联,将f的定义标记为INLINABLE是一个好主意,这样GHC就可以保证揭示一个展开,而不pipe它有多大。 此外,通过将f注释为INLINABLE,可以确保f的原始RHS是内联的,而不是任何随机优化的GHC优化器生成的版本。 INLINABLE pragma也适用于SPECIALIZE:如果将函数f标记为INLINABLE,那么随后可以在另一个模块中进行SPECIALIZE(请参见第7.16.8节“SPECIALIZE pragma”)。 与INLINE不同的是,在recursion函数中使用INLINABLE编译指示是可以的。 这样做的主要原因是为了让以后使用SPECIALIZE 它有什么缺点? 它是否使界面文件更大,更大? 它会使编译速度变慢吗? 有什么理由不应该在我写的每个导出的函数上放置一个INLINABLE编译指示? 有没有什么原因GHC不会在我写的每个导出的函数上放置一个INLINABLE编译指示?

如何编写一个以可变参数为参数的Haskell函数

我试图创build一个函数,获取一个可变参数作为参数 ,即 func :: (a -> … -> a) -> a 我怎么能做到这一点? 我读过关于polyvariadic函数 ,我敢肯定, Oleg已经做到了 ,但是我迷失了,试图将函数的模式应用到函数中,并且使用可变参数作为参数。 特别是Olegs的方法似乎只与格拉斯哥扩展工作,我希望解决scheme在纯粹的Haskell 98(如Text.Printf呢 )工作。 我问的原因是我试图build立一个函数,它将一个布尔函数作为一个参数,并检查它是否是一个重言式,即 isTautology :: (Bool -> … -> Bool) -> Bool 所以你可以input: isTautology (\x -> x && not x) isTautology (\xy -> x && y || not y) 我的问题是,我一直在阅读的诀窍是使返回types的typesvariables(以便它可以是结果或另一个函数),但我的返回types是固定的(Bool)。

Haskell预monadic I / O

我想知道在IO monad还没有发明的时候,如何在Haskell中完成I / O。 有人知道一个例子。 编辑:如果没有现代Haskell中的IO Monad,我能完成吗? 我更喜欢与现代GHC一起工作的例子。