2016-06-01 10 views
2

私はHaskellで私のリストを実装したいと思います。 しかし、私はこれを行うことはできません。 <*>の実装はHaskel - リストの<*>の実装

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」と一致しませんでした

...に縛ら剛性型変数であります
+3

':+'コンストラクタを使って2つのリストを連結しようとしています。 – zaquest

+0

ありがとう!今、私は分かる。 – redstone

答えて

4

zaquestが指摘しているように、連結する代わりにプリペンドしています。

だから、最初の連結を実装:

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:もちろんあなたはそれを名前を変更することができます - 私は+:+がここ:+ようMOSTEに見えたと思った)

+0

ありがとうございます! – redstone

関連する問題