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