我试图理解(++)
Haskell中表达式const的类型.我知道各种类型的const
和(++)
我知道您可以省略参数以返回部分应用的函数.
如果我输入,:t const (++)
我会const (++) :: b -> [a] -> [a] -> [a]
.我想的方式是(++)
想要两个列表(我知道Haskell中的所有函数都是curried函数,实际上只接受一个参数)并返回一个列表.这个列表是const
函数的第一个参数,它等待一个参数.所以,我认为类型会是const (++) :: [a] -> [a] -> b -> [a].
但是例如:const (++) 1 "hello" "you"
返回"helloyou"
.为什么从const
操作中返回的东西不是第一个参数,根据其定义const
是const x _ = x
什么?在我的思考过程中我不正确?
我试图弄清楚f x y = 3 + y/x
Haskell中的点自由形式.我认为会是f = (3.0+) . flip (/)
,但答案是f2 = curry $ (3.0+) . (uncurry $ flip (/))
,这与f1 = curry ((3.0+) . (uncurry (flip (/))))
我得到的答案是一样的,但在开始之前翻转和咖喱之前是不接受的.
我看到该版本是如何工作的,但我不确定为什么需要curry和uncurry函数,为什么我的版本不起作用?(3.0+)
is 的类型a -> a
,我认为如果你flip (/)
通过函数组合用结果形式输入该函数,但是会(3.0+) . flip (/) 2 10
导致错误(为什么?)并且不会产生8.是不是多余的,然后再次咖喱而不是咖喱?
我试图理解表达式的类型(map . map)
.由于类型(.)
是(b -> c) -> (a -> b) -> a -> c
我不明白这是如何工作与地图功能,因为map取不与功能适应两个参数(b -> c)
和(a -> b)
.