diff --git a/src/Codegen.hs b/src/Codegen.hs
--- a/src/Codegen.hs
+++ b/src/Codegen.hs
@@ -5,7 +5,7 @@
 import Data.Map.Strict (Map)
 import qualified Data.Map.Strict as M
 import Data.Maybe (fromMaybe)
-import Data.Text (Text, pack, unpack)
+import Data.Text (Text, isInfixOf, pack, unpack)
 import qualified Data.Text as T
 import Language.Haskell.Codegen
 import Language.TL.AST hiding (ADT (..), Ann, App, Type (..))
@@ -55,15 +55,21 @@
 typeConv _ A.NatType = Type "Int"
 
 app :: Type -> [Type] -> Type
-app t = foldl (\acc ty -> App acc ty) t
+app t = foldr (\ty acc -> App acc ty) t
 
 convArg :: TyMap -> Arg -> Field
 convArg m Arg {..} =
-  Field
-    { name = argName,
-      ty = typeConv m argType,
-      ..
-    }
+  let ty = typeConv m argType
+   in Field
+        { name = argName,
+          ty = case ann of
+            Nothing -> ty
+            Just doc ->
+              if "may be null" `isInfixOf` doc
+                then warpM ty
+                else ty,
+          ..
+        }
 
 combToConstr :: TyMap -> Combinator -> Constr
 combToConstr m Combinator {..} =
@@ -74,7 +80,7 @@
     }
 
 formArr :: [Field] -> Type -> Ann -> TypeSig
-formArr fields resT resAnn = foldl (\res Field {..} -> Conn {..}) (Result {ty = resT, ann = resAnn}) fields
+formArr fields resT resAnn = foldr (\Field {..} res -> Conn {..}) (Result {ty = resT, ann = resAnn}) fields
 
 combToFun :: TyMap -> Combinator -> FunDef
 combToFun m c@Combinator {..} =
diff --git a/src/Language/Haskell/Codegen.hs b/src/Language/Haskell/Codegen.hs
--- a/src/Language/Haskell/Codegen.hs
+++ b/src/Language/Haskell/Codegen.hs
@@ -22,7 +22,7 @@
 prettyDoc (Just d) =
   let ls = T.lines d
       ds = fmap unsafeTextWithoutNewlines ls
-   in "-- |" <+> foldl1 (<>) (intersperse (line <> "--" <> line <> "--") ds) <> line
+   in "-- |" <+> foldl1' (<>) (intersperse (line <> "--" <> line <> "--") ds) <> line
 prettyDoc Nothing = mempty
 
 data ADT
@@ -40,7 +40,7 @@
 prettyConstrs [] = mempty
 prettyConstrs (x : xs) =
   vsep
-    [ foldl1 (<>) (intersperse (line <> "| ") (("=" <+> x) : xs)),
+    [ foldl1' (<>) (intersperse (line <> "| ") (("=" <+> x) : xs)),
       "deriving (Show, Eq, Generic)"
     ]
 
@@ -65,6 +65,10 @@
       }
   deriving (Show, Eq, Generic)
 
+warpM :: Type -> Type
+warpM (App (Type "[]") t') = App (Type "[]") (warpM t')
+warpM t = App (Type "Maybe") t
+
 instance Pretty Field where
   pretty Field {..} =
     prettyDoc ann
@@ -85,7 +89,7 @@
   pretty Constr {..} =
     let doc = prettyDoc ann
         n = unsafeTextWithoutNewlines name
-        fs = foldl (<>) mempty (intersperse ("," <> line) (fmap pretty fields))
+        fs = foldl' (<>) mempty (intersperse ("," <> line) (fmap pretty fields))
      in doc
           <> vsep
             [ n,
diff --git a/src/Processing.hs b/src/Processing.hs
--- a/src/Processing.hs
+++ b/src/Processing.hs
@@ -78,8 +78,8 @@
 
 convProgram :: Program -> ([ADT], [Function])
 convProgram prog =
-  foldl
-    ( \(c, f) blk -> case blk of
+  foldr
+    ( \blk (c, f) -> case blk of
         FunDeclBlk decls -> (c, (declBlockToFun $ filterAnnDecl decls) <> f)
         TypeDeclBlk decls -> ((declBlockToADT $ filterAnnDecl decls) <> c, f)
     )
diff --git a/tdlib-gen.cabal b/tdlib-gen.cabal
--- a/tdlib-gen.cabal
+++ b/tdlib-gen.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 87d8b332f3f3f40e3c87975b071928df3b431394f8d59a56968b8fcf9ffe65ed
+-- hash: 37bce2cd570e13b47dd98eea43c2b8baad194f052f8ff9d05754dbef5b28851e
 
 name:           tdlib-gen
-version:        0.3.0
+version:        0.4.0
 synopsis:       Codegen for TDLib
 description:    Please see the README on GitHub at <https://github.com/poscat0x04/tdlib-gen#readme>
 category:       Codegen
