Haskel - < *>的实现列表

时间:2016-06-01 13:27:11

标签: list haskell

我想在Haskell中实现我的列表。 但我不能这样做。 <*>的实施原因

data List a = a :+ (List a) | Empty deriving Show
infixr 9 :+

instance Functor List where
  fmap _ Empty     = Empty
  fmap f (a :+ xs) = f a :+ fmap f xs

instance Applicative List where
  pure x           = x :+ Empty
  Empty     <*> _  = Empty
  (f :+ fs) <*> xs =  fmap f xs :+  (fs <*> xs) -- Error

main :: IO ()
main = do
  print $ 1 :+ 2 :+ 3 :+ Empty
  print $ fmap (^2) (1 :+ 2 :+ 3 :+ Empty)
  print $ ((+1) :+ (*2) :+ (^2) :+ Empty) <*> (1 :+ 2 :+ 3 :+ Empty)

错误是

无法将预期类型'b'与实际类型'列表b'匹配       'b'是由...绑定的刚性类型变量。

1 个答案:

答案 0 :(得分:4)

正如zaquest所指出的那样,你正在提前而不是连接。

首先实现concat:

infixr 5 +:+
(+:+) :: List a -> List a -> List a
Empty +:+ ys = ys
(x :+ xs) +:+ ys = x :+ (xs +:+ ys)

然后在

中使用它
(f :+ fs) <*> xs =  fmap f xs +:+  (fs <*> xs)

(PS:当然你可以重命名它 - 我认为+:+看起来像:+这里的样式。