@@ -356,31 +356,19 @@ infer (Fix (Compose (Ann src x))) = runReader src $ case x of
356356 lhst ~~ listt
357357 rhst ~~ listt
358358 return $ listt
359− NBinary op lhs rhs | op `elem` [NEq, NNEq] -> do
360− lhst <- infer lhs
361− rhst <- infer rhs
362− lhst ~~ rhst
363− return $ NAtomic Bool
364− NBinary op lhs rhs
365− | op `elem` [NLt, NLte, NGt, NGte] -> do
366− lhst <- infer lhs
367− rhst <- infer rhs
368− -- TODO: Infer lhst and rhst are either Integer or Double
369− lhst ~~ rhst
370− return $ NAtomic Bool
371− NBinary op lhs rhs
372− | op `elem` [NPlus, NMinus, NMult, NDiv] -> do
373− lhst <- infer lhs
374− rhst <- infer rhs
375− -- TODO: Infer lhst and rhst are either Integer or Double
376− lhst ~~ rhst
377− return $ lhst
378− NBinary op lhs rhs | op `elem` [NAnd, NOr, NImpl] -> do
379− lhst <- infer lhs
380− rhst <- infer rhs
381− rhst ~~ NAtomic Bool
382− lhst ~~ NAtomic Bool
383− return $ NAtomic Bool
359+ NBinary NEq lhs rhs -> equality lhs rhs
360+ NBinary NNEq lhs rhs -> equality lhs rhs
361+ NBinary NLt lhs rhs -> comparison lhs rhs
362+ NBinary NLte lhs rhs -> comparison lhs rhs
363+ NBinary NGt lhs rhs -> comparison lhs rhs
364+ NBinary NGte lhs rhs -> comparison lhs rhs
365+ NBinary NPlus lhs rhs -> math lhs rhs
366+ NBinary NMinus lhs rhs -> math lhs rhs
367+ NBinary NMult lhs rhs -> math lhs rhs
368+ NBinary NDiv lhs rhs -> math lhs rhs
369+ NBinary NAnd lhs rhs -> logic lhs rhs
370+ NBinary NOr lhs rhs -> logic lhs rhs
371+ NBinary NImpl lhs rhs -> logic lhs rhs
384372 NSelect r path' def -> do
385373 setT <- infer r
386374 path <- getPath path'
@@ -435,6 +423,30 @@ infer (Fix (Compose (Ann src x))) = runReader src $ case x of
435423 condT ~~ NAtomic Bool
436424 infer body
437425 NSynHole _ -> NTypeVariable <$> freshSrc
426+ where
427+ equality lhs rhs = do
428+ lhst <- infer lhs
429+ rhst <- infer rhs
430+ lhst ~~ rhst
431+ return $ NAtomic Bool
432+ comparison lhs rhs = do
433+ lhst <- infer lhs
434+ rhst <- infer rhs
435+ -- TODO: Infer lhst and rhst are either Integer or Double or String
436+ lhst ~~ rhst
437+ return $ NAtomic Bool
438+ math lhs rhs = do
439+ lhst <- infer lhs
440+ rhst <- infer rhs
441+ -- TODO: Infer lhst and rhst are either Integer or Double
442+ lhst ~~ rhst
443+ return lhst
444+ logic lhs rhs = do
445+ lhst <- infer lhs
446+ rhst <- infer rhs
447+ rhst ~~ NAtomic Bool
448+ lhst ~~ NAtomic Bool
449+ return $ NAtomic Bool
438450
439451inferBinding :: [Binding (Fix NExprLocF)] -> InferM' (Map VarName NType)
440452inferBinding bindings = do