小编Gui*_*rel的帖子

是否有`read`函数的完全替代?

为什么函数read在无法解析其参数时终止可执行文件?

在我看来,拥有一个类型的函数会更方便String -> Maybe a,Nothing如果字符串无法解析为该类型a,则会返回,但我找不到类似的东西.我错过了什么?

haskell functional-programming casting

16
推荐指数
1
解决办法
725
查看次数

为什么州monad不可穿越?

直觉上,在我看来,可以使用状态monad的遍历,例如:

traverse (\a -> [a, a+1]) (state (\s -> (1, s + 1))) 
  = [state (\s -> (1, s + 1), state (\s -> (2, s + 1)]
Run Code Online (Sandbox Code Playgroud)

但是状态monad没有实现Traversable类型类.这是为什么?我试图找出一种方法来实现状态monad的遍历,似乎难以提取状态monad的结果,以便将它传递给作为遍历的第一个参数给出的函数.这不可能吗?

haskell

7
推荐指数
2
解决办法
584
查看次数

多次使用++:如果我从右到左强制进行评估,效率更高?

我想在一个表达式中一次附加3个或更多列表.

a ++ b ++ c
Run Code Online (Sandbox Code Playgroud)

将从左到右或从右到左评估++运算符?

1. (a ++ b) ++ c
2. a ++ (b ++ c)
Run Code Online (Sandbox Code Playgroud)

我会说选项2,因为如果++是一个前缀函数,我们会写++ a ++ b c自然导致++ b c首先进行评估.我不确定我是否正确.

但如果它是选项1,在我看来,从右到左明确地改变评估顺序更有效:

a ++ (b ++ c)
Run Code Online (Sandbox Code Playgroud)

原因如下:a ++ b ++ c将首先评估为ab ++ cn个步骤(其中n是a的长度,ab当然是a和b的连接)然后再进行abcn + m个步骤(m是b的长度,因此n + m是ab)的长度,总共2n + m步.然而,a ++ (b ++ c)首先评估为a ++ bcm步骤,然后再进行abcn个步骤,这仅仅是n + m个步骤.

我是哈斯凯尔的新手,不知道我在说什么,我想要一些确认.

haskell

6
推荐指数
2
解决办法
222
查看次数

haskell的外部功能?

我想编写一个使用函数定义的模块.例如:

module A
(someFun) where

someFun x = doSomethingWith externFun x
Run Code Online (Sandbox Code Playgroud)

我想externFun由用户定义,在导入模块A的文件中.有办法吗?或者这只是一个坏主意?

我当然可以将externFun作为参数传递给someFun,但是它看起来不太方便:每次调用someFun时要传递的函数都是相同的.

haskell

6
推荐指数
2
解决办法
167
查看次数

GHC的垃圾收集器选项-A和-H是什么意思?

我已经阅读了GHC的文档以及关于这些 和选项的答案.第一个为"分配区域"(或垃圾收集器的第0代)设置固定大小.第二个设置堆大小的下限.如果我很好地理解分代垃圾收集是如何工作的,那么对象将在第0代分配,当这个对象已满时,仍然需要的那些被复制到第1代,其他的被释放.我的问题是"分配区域",第0代,第1代和堆大小是如何相关的?是这样的:-A-H

  • 分配区域=第0代,
  • 第0代+第1代(+最终更多代)=堆大小?

然后,-A控制第一个的大小,而-H设置整体大小的下限?

haskell ghc

6
推荐指数
0
解决办法
65
查看次数

分层数据类型

我想分层定义数据类型,例如:

data Cat = BigCat | SmallCat
data Animal = Cat | Dog
Run Code Online (Sandbox Code Playgroud)

然后编写一个将Animals作为参数的函数,并使用如下模式匹配来编写它:

bigger::Animal -> Animal -> Bool
bigger SmallCat BigCat = False
bigger BigCat SmallCat = True
bigger Dog Cat = True
bigger Cat Dog = False
Run Code Online (Sandbox Code Playgroud)

编译器抱怨.它不希望Animal将函数签名中明确写入的类型Cat与模式匹配的第一行和第二行中的类型进行匹配.为什么哈斯克尔不承认大猫或小猫动物?

haskell

5
推荐指数
2
解决办法
516
查看次数

`evaluate`、`rwhnf` 和 `seq` 与它们的“深层”对应物有什么区别?

关于计时计算的 wiki 页面中,有一个为纯计算计时的示例。核心思想是使用函数evaluaternfseq确保1 + y在两次调用之间执行所需的计算(在下面的示例中)getCPUTime

time :: (Num t, NFData t) => t -> IO ()
time y = do
    start <- getCPUTime
    replicateM_ lim $ do
        x <- evaluate $ 1 + y
        rnf x `seq` return ()
    end   <- getCPUTime
Run Code Online (Sandbox Code Playgroud)

我想澄清一下函数的使用evaluaternfseq这里。

首先,将evaluate其参数评估为弱头范式,但它的另一个目的似乎是处理评估过程中可能发生的异常。我不确定没有它会发生什么,但我准备假设异常处理需要它。

然后,rnf将值计算为标准形式,以确保整个计算都发生在此处,并且由于调用evaluate. 正如这里所讨论的,这可能是也可能不是人们想要的,因为可能不需要额外的评估。

最后,seq确保rnf x在返回之前将表达式计算为弱头范式return () …

haskell lazy-evaluation

5
推荐指数
1
解决办法
92
查看次数

用镜头刺伤获得价值

我想编写一个函数,在Lens stab的帮助下将函数(a - > b)转换为函数(s - > t)(编辑:我意识到这个函数已经存在Setter s t a b并且被称为over或者%~,但是它没有回答下面使用镜头获取值的问题).看起来很简单,但我遇到了一个令人困惑的类型错误.要创建一个更小的示例,请考虑以下函数,它只返回镜头从第二个参数中提取的值:

f :: Lens s t a b -> s -> a
f l s = s ^. l
Run Code Online (Sandbox Code Playgroud)

这不编译.在^的第二个参数中有2个错误.(即l):

  • 无法将类型't'与's'匹配
  • 无法将类型'a'与'b'匹配

但是,以下编译:

f :: Getter s a -> s -> a
f l s = s ^. l
Run Code Online (Sandbox Code Playgroud)

然后,我意识到在镜头类型层次结构中,Lens和Getter之间的箭头指定s = t,a = b.有没有办法使用常规从Lens s t a b类型a的值中获取类型的值s

haskell lenses haskell-lens

4
推荐指数
1
解决办法
176
查看次数

完成使用quickCheckAll的最小示例

我可以使用一个如何使用的完整示例quickCheckAll.这是我到目前为止所尝试的:

在文件中A.hs:

module A where
    import Test.QuickCheck

    prop_a = 1 == 0

    check = do
        return []
        $quickCheckAll
Run Code Online (Sandbox Code Playgroud)

在另一个应该驱动测试的文件中:

import A

main :: IO ()
main = do
    check
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为check没有类型IO ().我应该按照文档中的说明"执行检查" ?

haskell quickcheck

4
推荐指数
1
解决办法
353
查看次数

QuickCheck中是否存在"存在"量词?

有一个forAll量词,它返回一个属性,检查所有测试用例是否通过.有没有办法定义一个"存在"量词,它返回一个属性,检查它至少有一个测试用例通过?

haskell quickcheck

4
推荐指数
1
解决办法
209
查看次数