Haskell:类和函数重载:

用户名

我对Haskell很陌生。我正在尝试为不同的容器重载自定义函数“ myadd”。我的理解是,您必须通过课堂来做到这一点。这是我尝试的:

class Addition a where
  myadd :: a -> a -> a

instance Addition Int where
  myadd a b = a + b

instance Addition Maybe where
  myadd (Just a) (Just b) = Just (a + b)

main = do
  let a = 3 :: Int
  let b = 4
  let c = myadd a b
  print c

  let d = (Just a)
  let e = (Just b)
  let f = myadd d e
  print f

但我得到以下错误:

test.hs:7:19: error:
    ? Expecting one more argument to ‘Maybe’
      Expected a type, but ‘Maybe’ has kind ‘* -> *’
    ? In the first argument of ‘Addition’, namely ‘Maybe’
      In the instance declaration for ‘Addition Maybe’
贾斯汀·雷蒙德(Justin Raymond)

Addition有善意* -> *,因此对的论点Addition必须是善意*Maybe有善良* -> *您需要传递一个额外的type参数,Maybe以使其具有kind *

instance Addition (Maybe a)

问题是这Maybe a不是Additionfor任意的实例a,仅是for的a实例Addition您可以指定这样a的实例的要求Addition

instance Addition a => Addition (Maybe a)

您的实现也应该使用myadd而不是+

instance Addition a => Addition (Maybe a) where
   myadd (Just a) (Just b) = Just (myadd a b)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章