这块Haskell代码运行速度比-O慢得多,但是-O应该是非危险的 。 谁能告诉我发生了什么事? 如果重要的话,这是一个试图解决这个问题 ,它使用二进制search和持久段树: import Control.Monad import Data.Array data Node = Leaf Int — value | Branch Int Node Node — sum, left child, right child type NodeArray = Array Int Node — create an empty node with range [l, r) create :: Int -> Int -> Node create lr | l + 1 […]
我是Haskell的新手,我很迷惑Where- Let 。 他们似乎都提供了类似的目的。 我已经读了几个比较之间的比较,但我很难辨别什么时候使用每个。 有人可以提供一些上下文,或者可以举几个例子来说明什么时候使用一个吗? 在哪里与让 where子句只能在函数定义的级别上定义。 通常,这与let定义的范围是一致的。 唯一的区别是当警卫正在使用 。 where子句的范围遍及所有的守卫。 相比之下, letexpression式的范围只是当前的函数子句和守卫(如果有的话)。 Haskell备忘单 Haskell维基是非常详细的,并提供了各种情况,但它使用假设的例子。 我觉得它的解释对于初学者来说太简单了。 Let的优点 : f :: State sa f = State $ \x -> y where y = … x … Control.Monad.State 将不起作用,因为where引用了模式匹配f =,其中x不在范围内。 相反,如果你开始放手,那么你就不会有麻烦了。 Haskell Wiki关于Let的优点 f :: State sa f = State $ \x -> let y = […]
map :: (a -> b) -> [a] -> [b] fmap :: Functor f => (a -> b) -> fa -> fb liftM :: Monad m => (a -> b) -> ma -> mb 为什么我们有三个不同的function基本上是一样的?
我有三个函数可以find列表的第n个元素: nthElement :: [a] -> Int -> Maybe a nthElement [] a = Nothing nthElement (x:xs) a | a <= 0 = Nothing | a == 1 = Just x | a > 1 = nthElement xs (a-1) nthElementIf :: [a] -> Int -> Maybe a nthElementIf [] a = Nothing nthElementIf (x:xs) a = […]
在F#中,使用pipe道转发运算符|>很常见。 然而,在Haskell中,我只见过函数组合(.)被使用。 我明白,他们是相关的 ,但有没有一个语言的原因,没有在Haskell中使用pipe道转发还是别的东西?
我怎样才能得到esqueleto从一个语句生成一个SQLstring? toRawSql的文档说“你可能只是打开持久性的查询日志logging”。 我尝试了所有可能的MonadLoggerforms,但是从未打印过任何SQL。 同样的文件也说“手动使用这个function…是可能的,但繁琐的”。 但是,没有该types的构造函数,也没有任何返回typesQueryType被导出。 我设法通过注意到QueryType是一种新types并使用unsafeCoerce ! 我也被迫提供一个Connection (我通过SQLite),即使不应该连接到数据库来生成SQL。 这是我得到的。 一定会有更好的办法。 withSqliteConn ":memory:" $ \conn -> return $ toRawSql SELECT (unsafeCoerce ((const mempty) :: a -> Text.Lazy.Builder.Builder)) (conn, initialIdentState) myFromStatement) http://hackage.haskell.org/package/esqueleto-1.3.4.2/docs/Database-Esqueleto-Internal-Sql.html
在GHCi: Prelude> error (error "") *** Exception: Prelude> (error . error) "" *** Exception: *** Exception: 为什么不是第一个嵌套exception?
作为我的第一个编程语言,我决定学习Haskell。 我是一个分析哲学专业,Haskell允许我快速正确地创build感兴趣的程序,例如,用于自然语言分析的转换器,定理certificate器和解释器。 虽然我只编程了两个半月,但我发现Haskell的语义和语法要比传统的命令式语言更容易学习,而且对于大多数的构造来说,现在感觉很舒服。 Haskell编程就像魔法一样,但是我想扩大编程知识。 我想select一种新的编程语言来学习,但我没有足够的时间去select一种任意的语言,放弃它,然后重复。 所以我想我会在这里提出这个问题,以及关于我正在寻找的语言types的几个规定。 有些是主观的,有些是为了缓解从哈斯克尔的过渡。 强types系统。 Haskell编程中我最喜欢的部分之一是编写types声明。 这有助于构build我对个人职能及其与整个计划关系的思考。 这也使我的程序的正确性非正式的推理更容易。 我关心的是正确性,而不是效率。 强调recursion而不是迭代。 我在Haskell中使用迭代构造,但recursion地实现它们。 但是,理解recursion函数的结构要比复杂的迭代过程容易得多,特别是在使用组合器和更高阶函数(如地图,折叠和绑定)的情况下。 奖励学习。 Haskell是一个有用的语言,有点像阅读康德。 几年前我和C的经验不是。 我不是在寻找C.语言应该强化一个概念上有趣的范式,在我完全主观的意见中,C-like不这样做。 衡量答案 :当然,这些只是笔记。 我只想回答所有给予答复的人。 你一直很有帮助。 1)有几个回应表明,强调recursion的静态types语言意味着另一种function语言。 当我想继续与Haskell强有力的合作时,camccann和larsmans正确地指出另一种这样的语言会“缓解过渡的太多”。 这些评论非常有帮助,因为我不打算在Caml编写Haskell! 在certificate助理中,Coq和Agda看起来都很有趣。 特别是Coq将为build构逻辑和formstypes理论提供一个坚实的介绍。 我花了一点时间用一阶谓词和模态逻辑(Mendellsohn,Enderton,一些Hinman),所以我可能会用Coq很有趣。 2)其他人非常青睐Lisp(Common Lisp,Scheme和Clojure)。 从我所收集的内容来看,Common Lisp和Scheme都有很好的介绍材料( On Lisp和The Reasoned Schemer , SICP )。 SICP中的材料使我倾向于Scheme。 特别是通过SICP的计划将包括一个不同的评估策略,实施懒惰,以及关注延续,口译,符号计算等主题的机会。 最后,正如其他人所指出的,Lisp对代码/数据的处理将是全新的。 因此,我倾向于select(2),一个Lisp。 3)三,Prolog。 Prolog有很多有趣的材料,其主要领域正是我感兴趣的领域。它有一个简单的语法,很容易阅读。 我目前无法评论,但在阅读了Prolog的概述并略读了一些介绍性材料之后,它与(2)排在了一起。 而且似乎Prolog的回溯总是被黑客攻入Haskell! 4)在主stream语言中,Python看起来最有趣。 蒂姆耶茨使语言听起来非常有吸引力。 显然,Python经常被教给一年级的CS专业; 所以它要么在概念上丰富或容易学习。 我不得不做更多的研究。 谢谢大家的build议! 它看起来像一个Lisp(Scheme,Clojure),Prolog,或像Coq或Agda这样的certificate助手是推荐的主要语言。
通过阅读这篇经典论文 ,我被困在paramorphisms。 不幸的是,该部分是非常薄,维基百科页面没有说什么。 我的Haskell翻译是: para :: (a -> [a] -> b -> b) -> b -> [a] -> b para f base = h where h [] = base h (x:xs) = fx xs (h xs) 但是我并不这么认为 – 我没有任何types签名或期望结果的直觉。 什么是paramorphism,什么是一些有用的例子在行动? 是的,我已经看到了这些 问题 ,但是它们并没有直接涵盖副变形,只是指向可能有助于引用的资源 ,而不是作为学习材料。
在我最近的Gibbs sampling 工作中 ,我一直在使用RVar ,在我看来,它提供了一个非常理想的随机数生成接口。 可悲的是,由于无法在地图中使用monadic动作,我一直无法使用Repa。 虽然明显的单子映射一般是不可能并行化的,但在我看来, RVar可能至less是一个monad的例子,在这个例子中,效果可以被安全地并行化(至less在原则上,我并不熟悉内部工作原理RVar )。 也就是说,我想写下如下的东西, drawClass :: Sample -> RVar Class drawClass = … drawClasses :: Array U DIM1 Sample -> RVar (Array U DIM1 Class) drawClasses samples = A.mapM drawClass samples A.mapM看起来像这样, mapM :: ParallelMonad m => (a -> mb) -> Array r sh a -> m (Array r […]