我是Haskell的初学者,并且从"了解你一个Haskell"中学到了一些我对Foldable的Tree实现不了解的东西.
instance F.Foldable Tree where
foldMap f Empty = mempty
foldMap f (Node x l r) = F.foldMap f l `mappend`
f x `mappend`
F.foldMap f r
Run Code Online (Sandbox Code Playgroud)
引用来自:LYOH:"因此,如果我们只为某种类型实现foldMap,我们可以免费获得该类型的foldr和foldl!"
有人可以解释一下吗?我不明白为什么以及如何免费获得foldr和foldl ..
我试图为身份编写一个 QuickCheck 测试
f $ y = f y
Run Code Online (Sandbox Code Playgroud)
我最初的计划是编写一个返回函数和整数的任意生成器,具有签名Gen (Int -> Int, Int)
并且在prop_DollerDoesNothing测试中,带/不带函数应用程序$给出相同的结果。
这是我的代码:
prop_DollarDoesNothing :: Property
prop_DollarDoesNothing =
forAll arbitraryFuncInt (\(f, y) -> (f $ y) == (f y))
arbitraryFuncInt :: Gen (Int -> Int, Int)
arbitraryFuncInt = do
f <- elements [(\x -> x*2), (\x -> x+3), (\x -> x-2)]
y <- arbitrary :: Gen Int
return (f, y)
Run Code Online (Sandbox Code Playgroud)
它生成了以下有用的错误消息:
* No instance for (Show (Int -> Int))
arising from a …Run Code Online (Sandbox Code Playgroud)