Questions tagged «haskell»

Haskell是一种功能性编程语言,具有强大的静态类型,惰性评估,广泛的并行性和并发支持以及独特的抽象功能。

4
Haskell是否具有尾递归优化?
我今天在Unix中发现了“ time”命令,以为我会用它来检查Haskell的尾递归函数与普通递归函数之间的运行时差异。 我编写了以下函数: --tail recursive fac :: (Integral a) => a -> a fac x = fac' x 1 where fac' 1 y = y fac' x y = fac' (x-1) (x*y) --normal recursive facSlow :: (Integral a) => a -> a facSlow 1 = 1 facSlow x = x …

7
为什么用功能语言编写编译器更容易?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 改善这个问题 我考虑这个问题已经很长时间了,但实际上在Google上找不到答案,在Stackoverflow上也找不到类似的问题。如果有重复,对不起。 许多人似乎都说,用命令式语言编写使用OCaml和Haskell等功能语言编写的编译器和其他语言工具要高效得多,并且更容易。 这是真的?如果是的话,为什么用功能性语言而不是像C这样的命令性语言编写它们是如此高效和容易?而且-功能语言中的语言工具难道不比C等低级语言慢吗?

5
更高种类的类型什么时候有用?
我从事F#开发工作已有一段时间了,我喜欢它。但是我知道在F#中不存在的一个流行词是类型较高的类型。我已经阅读了有关高类型类型的材料,我想我理解它们的定义。我只是不确定为什么它们有用。有人可以提供一些示例,说明在Scala或Haskell中哪种类型更高级的类型更容易,而这需要F#中的解决方法?同样对于这些示例,如果没有更高类型的类型(或者在F#中反之亦然),解决方法将是什么?也许我只是很习惯解决它,以至于我没有注意到该功能的缺失。 (我认为)我得到了替代myList |> List.map f或myList |> Seq.map f |> Seq.toList更高种类的类型,使您可以简单地编写myList |> map f并返回List。很好(假设是正确的),但是看起来有点小?(难道不能简单地通过允许函数重载来完成吗?)我通常Seq无论如何都会转换为,然后我可以转换为以后想要的任何东西。再说一次,也许我只是太习惯了。但是,有没有在那里,kinded更高类型的任何例子真的可以节省你无论是在击键或类型安全?

2
直觉类型理论的组合逻辑等效是什么?
我最近完成了一门以Haskell和Agda(依赖型函数式编程语言)为特色的大学课程,并且想知道是否有可能用组合逻辑代替lambda微积分。使用Haskell,使用S和K组合器似乎可以实现这一点,从而使其变得毫无意义。我想知道阿格达相当于什么。即,是否可以在不使用任何变量的情况下使等效类型化的函数式编程语言等效于Agda? 另外,是否有可能用合并器代替量化?我不知道这是否是巧合,但是例如通用量化会使类型签名看起来像lambda表达式。有没有办法从类型签名中删除通用量化而不改变其含义?例如: forall a : Int -> a < 0 -> a + a < a 可以不花大价钱表达同一件事吗?

4
如何使用修复程序,它如何工作?
我对文档感到有些困惑fix(尽管我认为我现在知道它应该做什么),所以我查看了源代码。这让我更加困惑: fix :: (a -> a) -> a fix f = let x = f x in x 这究竟如何返回固定点? 我决定在命令行中尝试一下: Prelude Data.Function> fix id ... 它挂在那里。现在说句公道话,这是在我的旧Macbook上,有点慢。但是,此函数在计算上不会太昂贵,因为传递给id的任何东西都会返回相同的结果(更不用说它占用了CPU时间)。我究竟做错了什么?


1
如何获得esqueleto为我生成SQL字符串?
如何让esqueleto从from语句生成SQL字符串? 的文档toRawSql说:“您可以只打开持久性查询日志”。我尝试了所有可能MonadLogger理解的形式,但从未打印任何SQL。同一文档还说“手动使用此功能...是可能的,但很乏味”。但是,不会QueryType导出该类型的构造函数,也不会导出任何返回该类型的值的函数。我设法注意到QueryTypeanewtype并使用来解决这个问题unsafeCoerce! Connection即使没有必要连接到数据库来生成SQL,我也不得不提供一个(通过SQLite获得)。 这就是我所拥有的。一定会有更好的办法。 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

6
Haskell中的孤立实例
使用该-Wall选项编译Haskell应用程序时,GHC会抱怨孤立实例,例如: Publisher.hs:45:9: Warning: orphan instance: instance ToSElem Result 类型类ToSElem不是我的,它是由HStringTemplate定义的。 现在,我知道如何解决此问题(将实例声明移动到声明Result的模块中),并且我知道为什么GHC宁愿避免使用孤立的实例,但我仍然相信我的方法会更好。我不在乎编译器是否不便-而不是我。 我想ToSElem在Publisher模块中声明实例的原因是因为它是Publisher模块依赖于HStringTemplate,而不是其他模块。我试图保持关注的分离,并避免让每个模块都依赖HStringTemplate。 我认为,例如与Java的接口相比,Haskell的类型类的优点之一是它们是开放的而不是封闭的,因此实例不必在与数据类型相同的位置声明。GHC的建议似乎是忽略这一点。 因此,我正在寻找的要么是验证我的想法是正确的,要么是忽略/抑制该警告是有道理的,要么是更令人信服的反对以我的方式做事的论据。
86 haskell  ghc  typeclass 

6
Haskell中的点运算符:需要更多说明
我试图了解在此Haskell代码中点运算符在做什么: sumEuler = sum . (map euler) . mkList 整个源代码如下。 我的理解 点运算符将两个函数sum以及的结果map euler和的结果mkList作为输入。 但是,sum函数不是函数的参数吗?那么这是怎么回事? 另外,在(map euler)做什么? 码 mkList :: Int -> [Int] mkList n = [1..n-1] euler :: Int -> Int euler n = length (filter (relprime n) (mkList n)) sumEuler :: Int -> Int sumEuler = sum . (map …

17
Haskell之后要学习什么语言?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案能得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 作为我的第一门编程语言,我决定学习Haskell。我是分析哲学专业的学生,​​Haskell允许我快速而正确地创建感兴趣的程序,例如,用于自然语言解析的转换器,定理证明和解释器。尽管我只从事了两个半月的编程,但我发现Haskell的语义和语法比更传统的命令式语言更容易学习,并且对大多数构造感到满意(现在)。 但是,在Haskell中进行编程就像是巫术,我想扩展我的编程知识。我想选择一种新的编程语言来学习,但是我没有足够的时间来挑选一种任意的语言,删除它并重复。所以我想在这里提出这个问题,以及关于我要寻找的语言类型的一些规定。有些是主观的,有些是为了简化从Haskell的过渡。 强类型系统。在Haskell中,我最喜欢的编程部分之一是编写类型声明。这有助于构造我对单个功能及其与程序整体关系的思想。这也使非正式的推理程序变得更加容易。我关注的是正确性,而不是效率。 强调递归而不是迭代。我在Haskell中使用了迭代构造,但是递归地实现了它们。但是,与复杂的迭代过程相比,了解递归函数的结构要容易得多,尤其是在使用组合器和高阶函数(例如图,折叠和绑定)时。 奖励学习。Haskell是一种有用的工作语言。这有点像阅读Kant。但是,几年前我没有使用C的经验。我不是在寻找C。这种语言应该执行一种概念上有趣的范式,就我完全主观的观点而言,C语言不是。 权衡答案:当然,这些只是笔记。我只想回复所有给出正确答案的人。您一直很有帮助。 1)若干答复表明,强调递归的强大的静态类型语言意味着另一种功能语言。尽管我想继续与Haskell进行紧密合作,但是camccann和larsmans正确地指出,另一种这样的语言会“过度简化过渡”。这些评论非常有帮助,因为我不想用Caml写Haskell!在证明助手中,Coq和Agda都很有趣。特别是,Coq将为构造逻辑和形式类型理论提供扎实的介绍。我花了一会儿时间来研究一阶谓词和模态逻辑(Mendellsohn,Enderton和某些Hinman),所以我可能会对Coq感到很多乐趣。 2)其他人则非常喜欢Lisp(通用Lisp,Scheme和Clojure)。据我了解,Common Lisp和Scheme都有出色的入门资料(关于Lisp和The Reasoned Schemer,SICP)。SICP中的材料使我倾向于使用Scheme。特别是,通过SICP进行的计划将涵盖不同的评估策略,懒惰的实现,并有机会关注诸如延续,解释器,符号计算等主题。最后,正如其他人指出的那样,Lisp对代码/数据的处理将是全新的。因此,我非常倾向于选项(2),即Lisp。 3)第三,序言。Prolog有很多有趣的材料,它的主要领域正是我感兴趣的领域。它的语法简单,易于阅读。目前,我无法发表更多评论,但是在阅读了Prolog的概述并浏览了一些入门资料之后,它的排名为(2)。看来,Prolog的回溯一直被黑客入侵Haskell! 4)在主流语言中,Python看起来最有趣。蒂姆·耶茨(Tim Yates)使这些语言听起来很吸引人。显然,Python通常是针对一年级CS专业的学生而教。因此它在概念上丰富或易于学习。我必须做更多的研究。 谢谢大家的建议!看起来像Lisp(方案,Clojure),Prolog或像Coq或Agda这样的证明助手是推荐的主要语言。

4
为什么不能使String成为类型类的实例?
鉴于: data Foo = FooString String … class Fooable a where --(is this a good way to name this?) toFoo :: a -> Foo 我想创建String一个实例Fooable: instance Fooable String where toFoo = FooString 然后,GHC抱怨: Illegal instance declaration for `Fooable String' (All instance types must be of the form (T t1 ... …

1
如何阅读GHC Core的“证明”?
我写了少量的Haskell,以了解GHC如何证明对于自然数,您只能将偶数减半: {-# LANGUAGE DataKinds, GADTs, KindSignatures, TypeFamilies #-} module Nat where data Nat = Z | S Nat data Parity = Even | Odd type family Flip (x :: Parity) :: Parity where Flip Even = Odd Flip Odd = Even data ParNat :: Parity -> * where PZ :: …

3
Haskell:为什么约定将辅助函数命名为“ go”?
go在阅读Haskell的材料或资料时,我会看到很多东西,但是我从未真正感到满意-(我想它在我的脑海中具有“ goto”的负面含义)。我开始学习Haskell与LYAH,而且在那里我拿起使用倾向的acc和step当写倍。书写惯例go从何而来? 最重要的是,这个名字到底go意味着什么?

1
MonadPlus,Alternative和Monoid类型类之间的区别?
标准库的Haskell类型类MonadPlus,Alternative以及Monoid各自提供两种方法具有基本相同的语义: 空值:mzero,empty或mempty。 操作a -> a -> a:在该类型类联接值加在一起mplus,<|>或mappend。 这三个规则均指定了实例应遵循的以下法律: mempty `mappend` x = x x `mappend` mempty = x 因此,似乎三个类型类都提供相同的方法。 (Alternative也提供some和many,但是它们的默认定义通常就足够了,因此,在这个问题上它们并不是太重要。) 所以,我的查询是:为什么这三个类非常相似?除了它们不同的超类约束之外,它们之间是否还有真正的区别?

3
假人的递归方案?
我正在寻找一些非常简单,易于掌握的递归方案和核心递归方案(催化变形,变形,同形等)的解释,它们不需要遵循大量的链接或打开类别理论教科书。我敢肯定,我在不知不觉中重塑了许多这样的方案,并在编码过程中将它们“应用”到了我的脑海中(我相信我们中的许多人都有),但是我不知道我的(共)递归方案是什么。使用被称为。(好的,我撒谎了。我只是在阅读其中的一些内容,这引发了这个问题。但是在今天之前,我还没有头绪。) 我认为这些概念在编程社区中的传播受到了人们可能会遇到的令人难以理解的解释和示例的阻碍,例如,在Wikipedia上以及在其他地方。 他们的名字也可能阻碍了它。我认为还有一些其他的数学名称较少(关于香蕉和铁丝网的东西?),但我也不知道我使用的递归方案的更可爱的名称是什么。 我认为使用示例数据类型代表简单的实际问题,而不是抽象数据类型(例如二叉树)会有所帮助。

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.