Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell-折叠多态函数吗?_Haskell - Fatal编程技术网

Haskell-折叠多态函数吗?

Haskell-折叠多态函数吗?,haskell,Haskell,如果一个函数适用于几种不同的类型,那么它就是多态的;因此,如果一个函数只适用于一种类型,那么它就是单态的。() 例如,map是多态的 map :: (a -> b) -> [a] -> [b] 但是,函数(foo)具有单态类型。它只接受Int的列表: foo :: (Int -> Int) -> [Int] -> [Int] foo = map Haskell中的foldr: foldr f z [] = z foldr f z (x:xs) =

如果一个函数适用于几种不同的类型,那么它就是多态的;因此,如果一个函数只适用于一种类型,那么它就是单态的。()

例如,
map
是多态的

map :: (a -> b) -> [a] -> [b]
但是,函数(
foo
)具有单态类型。它只接受
Int
的列表:

foo :: (Int -> Int) -> [Int] -> [Int]
foo = map
Haskell中的foldr:

foldr f z []     = z 
foldr f z (x:xs) = f x (foldr f z xs) 

Fold
也是多态函数吗?

一般来说,
Fold
是一种允许遍历不同集合元素的模式。对于
foldr
,它适用于任何类型的列表:

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

所以从这个意义上说,它是一个多态函数。

一般来说,
折叠是一种允许遍历不同集合元素的模式。对于
foldr
,它适用于任何类型的列表:

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

从这个意义上讲,它是一个多态函数。

你可以通过GHCi询问Haskell自己:

Prelude> :t foldr
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b

如您所见,它完全是从参数多态类型(
a
b
t
)定义的,其中
t
是可折叠的

Prelude> :t foldr
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b

如您所见,它完全是从参数多态类型(
a
b
t
)定义的,其中
t
是可折叠的。

一般来说,
fold
是一种允许遍历不同集合元素的模式。对于
foldr
,它适用于任何类型的列表。从这个意义上说,它是一个多态函数。一般来说,
fold
是一种允许遍历不同集合元素的模式。对于
foldr
,它适用于任何类型的列表。因此,从这个意义上说,它是一个多态函数。实际上,该类型比GHC 7.10+中的类型更具包容性(我认为这是正确的版本),因为
foldr::Foldable t=>(a->b->b->ta->b
,也就是说,任何类型的折叠都可以折叠,而不仅仅是列表。是的,我刚从大学课堂上记得
foldr
的类型,我没有
GHCi来窥探它的实际类型,只是想说明一下这个想法。不过还是要指出这一点,谢谢。即使
foldr
仍然局限于列表,严格来说它仍然是从
a->b->b
b->[a]->b
的函数。该域仍然是通用的,即使编码域不是(完全)这样。实际上,该类型比GHC 7.10+中的类型更具包容性(我认为这是正确的版本),因为
foldr::Foldable t=>(a->b->b->ta->b
,即任何类型的折叠都可以折叠,而不仅仅是列表。是的,我刚从大学课堂上记住了foldr的类型,我没有看到它的实际类型,只是想说明一下这个想法。不过还是要指出这一点,谢谢。即使
foldr
仍然局限于列表,严格来说它仍然是从
a->b->b
b->[a]->b
的函数。该域仍然是通用的,即使编码域不是(完全)通用的。