我刚写了以下两个函数:
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)
Run Code Online (Sandbox Code Playgroud)
它们可能用于组合两个布尔函数的值,例如:
import Text.ParserCombinators.Parsec
import Data.Char
nameChar = satisfy (isLetter `f_or` isDigit)
Run Code Online (Sandbox Code Playgroud)
看了这两个函数后,我意识到它们非常有用.以至于我现在怀疑它们是否包含在标准库中,或者更可能是使用现有函数有一种干净的方法来执行此操作.
这样做的"正确"方法是什么?
我有一个Haskell项目和Cabal包描述,允许我构建和安装我的包
$ cabal configure $ cabal build $ cabal install
但那怎么样cabal test?Cabal的帮助说用UserHooks配置测试套件,但我该怎么做呢?
有没有什么好方法可以制作小的haskell可执行文件?使用ghc6,一个简单的hello world程序似乎达到了370kB(在strip之前为523kB).C中的Hello世界大约是4kB(剥离前9kB).
这里没有争论,Haskell中有各种各样的机制来处理错误并妥善处理它们.错误monad,Either,Maybe,exception等.
那么为什么在Haskell中编写其他语言中容易出现异常的代码感觉更直接呢?
假设我想编写一个命令行工具来处理在命令行上传递的文件.我想:
所以一个非常直接的文件处理工具.
在Haskell中,我将使用Maybe和Either将这些代码包装在monad的某些组合中,并根据需要翻译和传播错误.最后,它都进入IO monad,我可以将状态输出给用户.
在另一种语言中,我只是抛出异常并捕获到适当的位置.直截了当.我不会花太多时间在认知困境中试图解开我需要的机制组合.
我只是接近这个错误,还是这种感觉有一些实质内容?
编辑:好的,我得到的反馈告诉我,这感觉更难,但事实并非如此.所以这是一个痛点.在Haskell中,我正在处理monad堆栈,如果我必须处理错误,我会在这个monad堆栈中添加另一个层.我不知道有多少电梯和其他语法垃圾只是为了使代码编译而添加,但增加了零语义含义.没有人觉得这增加了复杂性?
当我在Haskell中打开一个文件进行读取时,我发现在关闭文件后我无法使用该文件的内容.例如,该程序将打印文件的内容:
main = do inFile <- openFile "foo" ReadMode
contents <- hGetContents inFile
putStr contents
hClose inFile
Run Code Online (Sandbox Code Playgroud)
我期望将putStr线与hClose线交换将没有任何效果,但此程序不打印任何内容:
main = do inFile <- openFile "foo" ReadMode
contents <- hGetContents inFile
hClose inFile
putStr contents
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我猜这与懒惰评估有关,但我认为这些表达式会被排序,所以不会出现问题.你会如何实现这样的功能readFile?
我正在阅读Learn You a Haskell,我想知道为什么这么多东西都像列表一样,Prelude中的任何内容都没有使用类型类的本地工具来设置它:
"字节串的版本:被称为cons它需要一个字节和一个字节字符串并将字节放在开头.虽然很懒,但即使字节串中的第一个块未满,它也会产生一个新的块.这就是为什么如果要在bytestring的开头插入大量字节,最好使用cons的严格版本.
为什么没有一个类型类可列,它提供了什么:统一的功能Data.ByteString,Data.List,Data.ByteString.Lazy,等?这有什么原因,或者这只是传统Haskell的一个元素?使用:作为一个例子是一种轻描淡写的,也是从LYAH:
否则,bytestring模块有一些类似于Data.List中的函数,包括但不限于head,tail,init,null,length,map,reverse,foldl,foldr,concat,takeWhile,filter等
我基本上想要创建一个全屏窗口并在其上绘制不同颜色和大小的文本(并且还更新屏幕).我在python中使用了pygame,我正在寻找一个类似的库(应该相当容易使用).
+1,如果它也处理输入...
我正在运行一个长期存在的Haskell程序,它可以保留大量内存.运行+RTS -N5 -s -A25M(我的L3缓存的大小)我看到:
715,584,711,208 bytes allocated in the heap
390,936,909,408 bytes copied during GC
4,731,021,848 bytes maximum residency (745 sample(s))
76,081,048 bytes maximum slop
7146 MB total memory in use (0 MB lost due to fragmentation)
Tot time (elapsed) Avg pause Max pause
Gen 0 24103 colls, 24103 par 240.99s 104.44s 0.0043s 0.0603s
Gen 1 745 colls, 744 par 2820.18s 619.27s 0.8312s 1.3200s
Parallel GC work balance: 50.36% (serial 0%, perfect 100%)
TASKS: 18 (1 bound, 17 …Run Code Online (Sandbox Code Playgroud) 如果您有可能拥有一个同时使用Haskell和C++的应用程序.你会让Haskell管理什么层,你会让C++管理哪些层?
有没有人做过这样的联想,(当然)?
(Haskell站点告诉它非常简单,因为Haskell有一个模式,可以通过gcc在C中编译)
起初我认为我会将所有I/O操作保留在C++层中.以及GUI管理.
这是一个非常模糊的问题,但是当我计划学习Haskell时,我正在考虑将一些工作委托给Haskell代码(我在实际编写中学习),并且我想选择一些我将看到Haskell好处的部分.
编译器或库中更"本机"的部分(IO或能够访问黑魔法和实现的函数)是否对这些定律做出假设?打破它们会导致不可能发生的事吗?
或者他们只是表达一种编程模式 - 也就是说,你唯一能够惹恼他们的人就是那些使用你的代码并且不希望你如此粗心的人?