类类Data.Foldable具有以下定义:
class Foldable t where
{-# MINIMAL foldMap | foldr #-}
foldMap :: Monoid m => (a -> m) -> t a -> m
foldr :: (a -> b -> b) -> b -> t a -> b
....
<more definitions>
Run Code Online (Sandbox Code Playgroud)
最小的节说,我可以用foldr函数定义一个实例.在我可以编译的所有示例中,foldr函数都有类型a -> a -> a.但是我无法定义折叠函数真正键入a -> b -> b哪些类型a和b
不同的东西.
以下代码显示了一个不编译的示例:
import Data.Foldable
data Tree a = Tree a a | Leaf a
class Size a where
size :: a -> Int
instance Size a => Foldable (Tree a) where
foldr :: a -> Int -> Int
foldr x n = size x + n
Run Code Online (Sandbox Code Playgroud)
是否有可能定义一个Foldable实例foldr,其中的类型a和b真正不同?
问题不在于类型不同.你的类型与需要的foldr不一样Foldable.它需要是:
foldr :: (a -> b -> b) -> b -> Tree a -> b
Run Code Online (Sandbox Code Playgroud)
而那些a和b类型参数必须保持为参数:这个已经工作了所有的选择a和b.您不能将它们约束到其他类型类,并且您不能将其中一个限制为具体Int类型.
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |