Фактически, отсутствие Just
делает не ошибочным.
Вот сделка.Код
nodeAreSame (Node a _ _) (Node b _ _)
| a == b = a
nodeAreSame _ _ = Nothing
хорошо напечатан при условии, что a
и b
имеют тип Maybe t
для некоторых t
, поскольку это тип Nothing
,Таким образом, система типов делает этот вывод.
Теперь, когда у вас есть числовой литерал, такой как 3
, предполагается, что он имеет тип Num s => s
, пока вы фактически не передадите его определенному типу данных (например, Int
или Double
).
Таким образом, когда он объединяет эти два факта, он предполагает следующее:
Num (Maybe t) => 3 :: Maybe t
.
Поскольку нет экземпляра дляNum (Maybe t)
, в этот момент он жалуется, прежде чем получает возможность жаловаться, что 3 :: Maybe t
не имеет смысла.