Tag: 哈斯克尔

在Haskell中为布尔函数执行`and`和`or`

我只写了以下两个函数: fand :: (a -> Bool) -> (a -> Bool) -> a -> Bool fand f1 f2 x = (f1 x) && (f2 x) f_or :: (a -> Bool) -> (a -> Bool) -> a -> Bool f_or f1 f2 x = (f1 x) || (f2 x) 它们可能被用来组合两个布尔函数的值,例如: import Text.ParserCombinators.Parsec import Data.Char nameChar = satisfy […]

infix操作符在Haskell中做了什么?

我正在阅读Haskell的一个温柔的介绍 (它不是那么温和),并且它反复使用:操作符,而不直接解释它做了什么。 那么,它究竟做了什么?

ghci'不在范围:'消息

我正在通过“学习你一个Haskell”教程,我在这一部分: lucky :: (Integral a) => a -> String 当我尝试执行这一行时,我得到: <interactive>:1:1: Not in scope: `lucky' 我究竟做错了什么?

QuickCheck 2有哪些新function?

QuickCheck 1和QuickCheck 2的主要区别是什么? 从查看Haddock文档,我可以看到它分成了更多的模块, coarbitrary已经被新的Funtypes和FunArbitrary类(这似乎更容易理解)替代,现在支持testing一元代码。 还有什么我应该知道的?

“string”应用于太多的types参数

我只是在学习Haskell,我正在编写一个简单的程序来消除String的前n个字符。 这是我得到的: cutString :: (Num n, String str) => n -> str -> str cutString n str = case n of 0 -> tail str n -> cutString (n-1) (tail str) GHC给了我这个错误,但我不明白为什么: `String' is applied to too many type arguments In the type signature for `cutString': cutString :: (Num n, String str) => n -> […]

Listables:OOP击败Haskell?

我想build立一个具有共同特性的不同事物的列表,即它们可以变成string。 面向对象的方法很简单:定义接口Showable并使感兴趣的类实现它。 第二点原则上可以是一个问题,当你不能改变类,但让我们假装不是这样的。 然后你创build一个Showable列表,并用这些类的对象填充它,而不会有任何额外的噪音(例如,上传通常是隐式的)。 Java中的概念certificate在这里给出 。 我的问题是我在Haskell有什么select? 下面我讨论一下我尝试过的方法,哪些方法不能满足我。 方法1 :existensials。 工作,但丑陋。 {-# LANGUAGE ExistentialQuantification #-} data Showable = forall a. Show a => Sh a aList :: [Showable] aList = [Sh (1 :: Int), Sh "abc"] 我这里的主要缺点是在填写清单时需要Sh 。 这类似于OO语言隐含的upcast操作。 更一般地说,虚拟包装器Showable已经在语言中的东西 – Showtypes类 – 在我的代码中增加了额外的噪音。 不好。 方法2 :暗示性。 期望但不起作用。 对我来说这样一个清单最直接的types,我真正渴望的是: {-# LANGUAGE ImpredicativeTypes #-} aList :: […]

在Haskell的无限列表中对术语进行懒惰的评估

我很好奇如下的无限列表的运行时性能: fibs = 1 : 1 : zipWith (+) fibs (tail fibs) 这将创build斐波纳契序列的无限列表。 我的问题是,如果我做到以下几点: takeWhile (<5) fibs fibs评估列表中的每个术语多less次? 看起来,因为takeWhile检查列表中每个项目的谓词函数, fibs列表将会多次评估每个项目。 前两项是免费的。 当takeWhile想在第三个元素上评估(<5)时,我们会得到: 1 : 1 : zipWith (+) [(1, 1), (1)] => 1 : 1 : 3 现在,一旦想要在第四个元素上评估(<5) : fibs的recursion性质将再次构build列表如下: 1 : 1 : zipWith (+) [(1, 2), (2, 3)] => 1 : 1 : […]

了解GHCi让绑定的不同行为

我一直在玩Simon Marlow关于Haskell中并行和并发编程的书中的一些例子,并偶然发现了一个我不太了解的有趣的行为。 这实际上是关于我想了解GHC的一些内部工作。 假设我在REPL中执行以下操作: λ» let x = 1 + 2 :: Int λ» let z = (x,x) λ» :sprint x x = _ λ» :sprint z z = (_,_) λ» seq x () () λ» :sprint z z = (3,3) 好吧,这几乎是我所期望的,除了z已经被评估为WHNF。 让我们写一个类似的程序,并把它放在一个文件中: module Thunk where import Debug.Trace x :: Int x = trace "add" […]

为什么monads? 它如何解决副作用?

我正在学习Haskell并试图理解Monads。 我有2个问题。 据我所知,Monad只是另一个types类,它声明了与“容器”内的数据进行交互的方法,包括Maybes,Lists和IOs。 用一个概念来实现这3个东西似乎是聪明和干净的,但真正的重点是在一系列函数,容器和副作用中可以有一个干净的error handling。 这是一个正确的解释? 其次,副作用的问题究竟如何解决? 用这个容器的概念,语言本质上是说容器内的任何东西都是非确定性的(如I / O)。 因为列表和IO都是容器,所以列表与IO是等价的,即使列表中的值对我来说也是相当确定的。 那么什么是确定性的,什么是副作用呢? 我不能把我的头围绕一个基本的值是确定性的想法,直到你把它放在一个容器中(这个容器没有什么特别的地方,而且它旁边还有一些其他值,例如Nothing),现在可以是随机的。 有人可以解释一下,Haskell如何通过input和输出改变状态? 我在这里看不到魔法。

推荐阅读/教程了解反应式香蕉玻璃钢库

我对FRP(Functional Reactive Programming) 反应式香蕉 haskell库感兴趣。 你会推荐一些新手去理解无功香蕉背后的理论吗? 据我所知,在这个领域有一些进展,不同的玻璃钢库使用不同的方法,所以我不认为任何玻璃钢纸都可以。