为什么函数read在无法解析其参数时终止可执行文件?
在我看来,拥有一个类型的函数会更方便String -> Maybe a,Nothing如果字符串无法解析为该类型a,则会返回,但我找不到类似的东西.我错过了什么?
直觉上,在我看来,可以使用状态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的结果,以便将它传递给作为遍历的第一个参数给出的函数.这不可能吗?
我想在一个表达式中一次附加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个步骤.
我是哈斯凯尔的新手,不知道我在说什么,我想要一些确认.
我想编写一个使用函数定义的模块.例如:
module A
(someFun) where
someFun x = doSomethingWith externFun x
Run Code Online (Sandbox Code Playgroud)
我想externFun由用户定义,在导入模块A的文件中.有办法吗?或者这只是一个坏主意?
我当然可以将externFun作为参数传递给someFun,但是它看起来不太方便:每次调用someFun时要传递的函数都是相同的.
我想分层定义数据类型,例如:
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与模式匹配的第一行和第二行中的类型进行匹配.为什么哈斯克尔不承认大猫或小猫是动物?
在关于计时计算的 wiki 页面中,有一个为纯计算计时的示例。核心思想是使用函数evaluate,rnf并seq确保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)
我想澄清一下函数的使用evaluate,rnf和seq这里。
首先,将evaluate其参数评估为弱头范式,但它的另一个目的似乎是处理评估过程中可能发生的异常。我不确定没有它会发生什么,但我准备假设异常处理需要它。
然后,rnf将值计算为标准形式,以确保整个计算都发生在此处,并且由于调用evaluate. 正如这里所讨论的,这可能是也可能不是人们想要的,因为可能不需要额外的评估。
最后,seq确保rnf x在返回之前将表达式计算为弱头范式return () …
我想编写一个函数,在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):
但是,以下编译:
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?
我可以使用一个如何使用的完整示例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 ().我应该按照文档中的说明"执行检查" ?
有一个forAll量词,它返回一个属性,检查所有测试用例是否通过.有没有办法定义一个"存在"量词,它返回一个属性,检查它至少有一个测试用例通过?