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
的函数。该域仍然是通用的,即使编码域不是(完全)通用的。