作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个这样定义的类,因此 foo
采用泛型类型并返回一个整数:
class Foo a where
foo :: a -> Integer
并定义了几个实例,因此它可以与 Bool
和 Char
类型一起使用:
instance Foo Bool where
foo _ = 10
instance Foo Char where
foo _ = 20
如果我现在想为具有泛型类型的列表添加一个实例,我想做这样的事情:
instance Foo [a] where
foo (t:ts) = (foo t) + (foo ts)
但是,这是错误的。根据我目前的理解,我想假设 Haskell 推断类型并执行以下操作:
foo [False,True] -> foo False + foo True -> 10 + 10 = 20
我看过几本关于多态性和类型类的书籍,包括 Learn You a Haskell For Great Good!但还是不知道如何解决这个问题?
最佳答案
你需要说列表必须包含 Foo
值:
instance Foo a => Foo [a] where
foo (h:t) = foo h + foo t
foo [] = 0
h
是 Foo
实例时只能调用 foo h
,因此需要限定类型类为 [ a]
使其仅适用于 Foo
实例的列表。
否则,例如,如果您有一个 [Int]
,则 foo h
将暗示您将尝试调用 foo
在 Int
值上,但没有为该类型定义 foo
。
通过 [a]
的上述实现,您将获得预期的结果:
Prelude> foo [True,False,True]
30
Prelude> foo [True,False,True,True]
40
Prelude> foo "foo"
60
关于带有列表的 Haskell 泛型类型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48442058/
我是一名优秀的程序员,十分优秀!