【发布时间】:2015-01-29 16:31:23
【问题描述】:
根据https://wiki.haskell.org/Compose的compose类型,可以写成compose :: [a -> a] -> (a -> a)
或compose :: [a -> a] -> a -> a
我认为这两种类型是不同的:前者接受一个函数列表并返回一个函数,后者接受一个函数列表和一个参数,然后最终返回一个值。
也就是说,当一个函数(高阶函数)将另一个函数作为参数或返回一个函数作为结果时,不应省略参数(结果)周围的括号,例如,如果 filter :: (a -> Bool) -> [a] -> [a] 删除括号,它的含义会改变。
我是对还是错?
【问题讨论】:
-
不是专家,但我认为这两种情况是一样的。这样做的原因是柯里化(wiki.haskell.org/Currying)
-
如果你 curry
compose只给它第一个参数,那么每种情况下的结果类型是什么,例如功能列表?这有助于解释发生了什么吗?在柯里化之后的这两种情况下,如果你只提供一个参数(输入a)会发生什么? -
我鼓励您考虑您希望能够进行哪些观察来区分这两种类型,并尝试在 ghci 中进行这些观察。他们有什么不同吗? (我以这种方式鼓励你,因为当我了解这个空间中发生的事情的那一刻,我的头脑爆炸了,从那以后我一直无法离开 Haskell。)
-
你错了——
->是右联想,所以a -> foodiebar自动变成(->) (a) (foodiebar)。函数也是如此:a -> b -> c是a -> (b -> c)。
标签: haskell