on 6f75310 help sign in
elk/compiler/Transform/Definition.hs
29 lines 1.0 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Transform.Definition where
4import Control.Applicative ((<$>))
5import qualified SourceSyntax.Pattern as P
6import SourceSyntax.Expression
7import qualified Transform.Expression as Expr
9combineAnnotations :: [ParseDef] -> Either String [Def]
10combineAnnotations = go
11 where
12 msg x = "Syntax Error: The type annotation for '" ++ x ++
13 "' must be directly above its definition."
15 go defs =
16 case defs of
17 TypeAnnotation name tipe : Def pat@(P.PVar name') expr : rest | name == name' ->
18 do expr' <- Expr.crawl combineAnnotations expr
19 let def = Definition pat expr' (Just tipe)
20 (:) def <$> go rest
22 TypeAnnotation name _ : _ -> Left (msg name)
24 Def pat expr : rest ->
25 do expr' <- Expr.crawl combineAnnotations expr
26 let def = Definition pat expr' Nothing
27 (:) def <$> go rest
29 [] -> return []