Haskell中常量的类型(+;+;)

Haskell中常量的类型(+;+;),haskell,Haskell,我试图理解Haskell中const(++)表达式的类型。我知道const和(++)的单独类型,并且我知道您可以省略参数以返回部分应用的函数 如果我键入:t const(++)我得到const(++)::b->[a]->[a]->[a]。我认为,(++)需要两个列表(但是我知道Haskell中的所有函数都是curried函数,实际上只接受一个参数),并返回一个列表。然后,此列表是const函数的第一个参数,该函数将等待另一个参数。所以,我认为类型应该是const(++)::[a]->[a]->b

我试图理解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\ux
?在我的思考过程中,我哪里是错误的

为什么const操作返回的东西不是第一个参数

是的。
const
的第一个参数是
(++)
。因此操作
常量(++)1
的结果实际上是
(++)
,这是第一个参数。所以
const(+++)1
(++)
,意思是
const(+++)1“你好”“你”
(++)“你好”“你”
,也就是
“你好”

现在,在
const(+++)
中,您希望将
(++)
作为
const
的参数。
const
的参数应该具有类型
c
,因此可以将其与类型
(++)
统一起来

并获得专门的版本

const :: ([a] -> [a] -> [a]) -> b -> ([a] -> [a] -> [a])

如果看起来很混乱,考虑更简单的例子<代码> const 1 。如果

1
有类型
Int
,那么我们必须有
c~Int
,在这种情况下

const :: Int -> b -> Int
因为函数箭头是右关联的,所以也可以编写
(++)
-专门化

const :: ([a] -> [a] -> [a]) -> b -> [a] -> [a] -> [a]
现在,如果你真的把它应用到
(++)
,你会使函数参数饱和,最后得到

const (++) :: b -> [a] -> [a] -> [a]
而且,
const(++)1“你好”“你”
(((((++)1)“你好”)“你”
((const(++)1)“你好”)“你”
(++)“你好”)“你”
一样是
(++)“你好”“你”
,也就是
“你好”+“你”
const :: ([a] -> [a] -> [a]) -> b -> [a] -> [a] -> [a]
const (++) :: b -> [a] -> [a] -> [a]