Ваша функция не имеет типа: x :: Int
и (False : _) :: [Bool]
, и эти два типа не могут быть объединены (читается ::
как "имеет тип").
Tweaked,
findInt (x:xs) =
if x == 1 then Left x
else Right False : findInt xs
он по-прежнему не имеет типа: Left x :: Either Int b
и (Right False : _) :: [Either a Bool]
, и эти два типа также не могут быть объединены.
Но
findInt :: [Int] -> Either Int Bool
findInt (x:xs) =
if x == 1 then Left x
else findInt xs
findInt [] = Right False
имееттип, потому что Left x :: Either Int b
и Right False :: Either a Bool
, и эти два типа могут быть унифицированными:
Either Int b
Either a Bool
----------------- a ~ Int , b ~ Bool
Either Int Bool
Унифицированный тип действительно Either Int Bool
, как указывает сигнатура типа.