Tag: haskell

Haskell脱机文档?

有什么可能,如果有的话,获得离线文档的Haskell核心库(也许更多)? 有时候,我把笔记本电脑拿到没有wifi的咖啡店,有Hoogle这样的东西可以离线使用。

什么是Haskell的严格点?

我们都知道(或者应该知道)Haskell默认是懒惰的。 评估之前,没有任何评估。 那么什么时候必须进行评估? 有几点Haskell必须严格。 我称之为“严格点”,虽然这个特定的术语并不像我想象的那样广泛。 据我所知: Haskell中的减less(或评估) 只发生在严格点上。 所以问题是: Haskell的严格性究竟是什么? 我的直觉说main seq / bang模式,模式匹配,以及通过main执行的任何IO动作都是主要的严格点,但是我不知道为什么我知道这一点。 (另外,如果他们不被称为“严格点”,他们叫什么?) 我想象一个好的答案将包括一些关于WHNF的讨论等等。 我也想象它可能会触及lambda演算。 编辑:关于这个问题的其他想法。 正如我在这个问题上所反映的那样,我认为在严格点的定义中增加一些内容会更清楚些。 严格点可以有不同的背景和不同的深度 (或严格性)。 回到我的定义:“减lessHaskell只发生在严格点上”,让我们在这个定义中增加这样一个条款:“一个严格点只有当它的周围环境被评估或减less时才会触发”。 所以,让我试着让你开始我想要的答案。 main是一个严格点。 它被特别指定为其上下文的主要严格点:程序。 当程序( main的上下文)被评估时,main的严格点被激活。 主要的深度是最大的:它必须充分评估。 主要通常由IO操作组成,这些操作也是严格点,其上下文是main 。 现在您尝试:以这些术语讨论seq和模式匹配。 解释function应用的细微差别:它是如何严格的? 它怎么样? 那么deepseq呢? let和case陈述? unsafePerformIO ? Debug.Trace ? 顶级定义? 严格的数据types? 爆炸模式? 等等这些项目中有多less可以用seq或模式匹配来描述?

函数式编程语言如何工作?

如果函数式编程语言不能保存任何状态,他们如何做一些简单的事情,比如读取用户的input? 他们如何“存储”input(或为此存储任何数据?) 例如:如何将这个简单的C的东西转换成像Haskell这样的函数式编程语言? #include<stdio.h> int main() { int no; scanf("%d",&no); return 0; } (我的问题受到了这个出色的文章的启发: “名词王国的执行” ,阅读它让我更好地理解了什么是面向对象的编程,Java如何以一种极端的方式实现它,以及函数式编程语言是如何对比。)

Haskell printf如何工作?

Haskell的types安全性对于依赖types语言来说是首屈一指的 。 但是, Text.Printf有一些非常神奇的东西 ,看起来相当不可思议 。 > printf "%d\n" 3 3 > printf "%s %f %d" "foo" 3.3 3 foo 3.3 3 这背后有什么深奥的魔力? Text.Printf.printf函数如何使用像这样的可变参数? 什么是用于允许在Haskell中可变参数的一般技术,它是如何工作的? (注意:使用这种技术时,某些types的安全性显然已经丢失。) > :t printf "%d\n" "foo" printf "%d\n" "foo" :: (PrintfType ([Char] -> t)) => t

Haskell的types检查器允许非常错误的typesreplace,并且程序仍然编译

在我的程序中尝试debugging一个问题时(使用Gloss的两个相同半径的圆正被绘制成不同的大小),我偶然发现了一个奇怪的情况。 在处理对象的文件中,我对Player有如下的定义: type Coord = (Float,Float) data Obj = Player { oPos :: Coord, oDims :: Coord } 并在我的主文件,其中导入Objects.hs,我有以下定义: startPlayer :: Obj startPlayer = Player (0,0) 10 发生这种情况是因为我添加和更改了播放器的字段,忘记更新startPlayer之后(它的尺寸是由一个单一的数字来表示一个半径,但是我把它改成了一个代表宽度,高度的Coord ;如果我永远让玩家对象成为非圆形)。 令人惊奇的是,上面的代码编译并运行,尽pipe第二个字段是错误的types。 我首先想到,也许我打开了不同版本的文件,但任何文件的任何更改都反映在编译的程序中。 接下来我想可能是因为某些原因, startPlayer没有被使用。 尽pipe如此,注释掉startPlayer产生编译器错误,甚至更奇怪的是,在startPlayer更改10会导致相应的响应(更改Player的开始大小)。 再次,尽pipe它是错误的types。 为了确保正确读取数据定义,我在文件中插入了一个错字,它给了我一个错误; 所以我正在看正确的文件。 我尝试将上面的2个代码片段粘贴到自己的文件中,并且抛出了startPlayer中Player的第二个字段不正确的错误。 什么可能允许这发生? 你会认为这是Haskell的types检查器应该防止的事情。

Yesod的例外

我做了一个守护进程,使用一个非常原始的ipcforms(远程login并发送一个string,按照一定的顺序有一定的字)。 我退出了它,现在使用JSON将消息传递给Yesod服务器。 不过,有些事情我真的喜欢我的devise,我不确定我现在的select。 以下是我正在做的事情: buildManager :: Phase -> IO () buildManager phase = do let buildSeq = findSeq phase jid = JobID $ pack "8" config = MkConfig $ Just jid flip C.catch exceptionHandler $ runReaderT (sequence_ $ buildSeq <*> stages) config — ^^ I would really like to keep the above line of code, […]

什么是Haskell中的Comonadtypes类?

什么是Haskell中的Comonadtypes类? 如Comonad包中的Control.Comonad中的Comonad (也提供对提供Comonadtypes类的任何其他包的解释)。 我隐约听说过Comonad,但是我真正知道的是,它提供了extract :: wa -> a ,类似于Monad的return :: a -> ma 。 在“真实”的代码中注明Comonad的“真实生活”用法的加分。

为什么ghci desugartypes列表和types的家庭? 可以select禁用吗?

我试图使我的图书馆的typesghci显示尽可能直观,但我遇到了很多困难,当使用更先进的typesfunction。 比方说,我有一个文件中的这个代码: {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeOperators #-} import GHC.TypeLits data Container (xs::[*]) = Container 我用ghci加载它,然后input以下命令: ghci> :t undefined :: Container '[String,String,String,String,String] 不幸的是,ghci给了我相当难看的样子: :: Container ((':) * String ((':) * String ((':) * String ((':) * String ((':) * String ('[] *)))))) ghci已经删除了types级别string的糖。 有没有办法阻止ghci这样做,给我只是漂亮的版本? 在相关的说明,让我们说我创build一个types级Replicatefunction data Nat1 = Zero […]

为什么Haskell的Prelude.read没有返回一个Maybe?

为什么Prelude.read的types有一个很好的理由 read :: Read a => String -> a 而不是返回一个Maybe值? read :: Read a => String -> Maybe a 由于string可能无法parsingHaskell,后者会不会更自然? 或者甚至是一个Either String a ,其中Left将包含原始string,如果它没有parsing,并且Right的结果,如果它? 编辑: 我不想让别人为我写一个相应的包装。 只是为了保证这样做是安全的。

为什么懒惰评估有用?

我一直在想,为什么懒惰的评估是有用的。 我还没有任何人以一种合理的方式向我解释; 大多数情况下,它最终会熬到“相信我”。 注意:我不是指记忆。