我已经看到很多函数是根据模式定义的(f .) . g.例如:
countWhere = (length .) . filter
duplicate = (concat .) . replicate
concatMap = (concat .) . map
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
haskell functional-programming pointfree function-composition tacit-programming
学习Haskell的第11章介绍了以下定义:
instance Applicative ((->) r) where
pure x = (\_ -> x)
f <*> g = \x -> f x (g x)
Run Code Online (Sandbox Code Playgroud)
在这里,作者参与了一些不寻常的挥手("<*>的实例实现有点神秘,所以如果我们只是[在没有解释它的情况下显示它的话]它是最好的").我希望这里的某个人可以帮助我搞清楚.
根据应用类定义, (<*>) :: f (a -> b) -> f a -> f b
在实例中,替换((->)r)为f:r->(a->b)->(r->a)->(r->b)
所以第一个问题是,我该如何从这种类型中获得f <*> g = \x -> f x (g x)?
但即使我认为最后一个公式是理所当然的,我也很难同意我给GHCi的例子.例如:
Prelude Control.Applicative> (pure (+5)) <*> (*3) $ 4
17
Run Code Online (Sandbox Code Playgroud)
这个表达式看起来与之相符f <*> g = \x -> f (g x)(请注意,此版本x之后不会出现f. …
我试图理解Haskell中的无点编程,并且我对一些例子提出了疑问,因为我并不真正理解错误发生时给出的解释.
1)我有一个循环函数定义如下:
myCycle :: [a] -> [a]
myCycle = foldr (++) [] . repeat
Run Code Online (Sandbox Code Playgroud)
为什么不起作用myCycle = foldr (++) [] $ repeat?
2)用2添加列表的每个元素,然后添加另一个列表
sum :: [Int] -> [Int] -> [Int]
sum s = zipWith (+) . map (+ 2) $ s
Run Code Online (Sandbox Code Playgroud)
为什么函数有同样的结果sum s = zipWith (+) $ map (+ 2) s?为什么sum l1 l2 = zipWith (+) . map (+ 2) $ l1 $ l2不工作