我想在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'是由...绑定的刚性类型变量。
答案 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:当然你可以重命名它 - 我认为+:+
看起来像:+
这里的样式。