КодТип тайны. Почему этот фрагмент кода компилируется?
default()
h :: Bool
h = 1.0 == 1.0 --Error. Ambiguity.
не компилируется. Это ожидается, потому что есть двусмысленность. Это может быть либо Float
, либо Double
, и Haskell не знает, какой из них мы хотим.
Но код
default()
foo :: (Fractional a, Eq a) => a -> Bool
foo x = x == 1.0
успешно компилируется. Я не совсем понимаю, почему. Почему это не так неоднозначно?
У меня есть ощущение, что это потому, что всякий раз, когда мы называем foo
, мы гарантированно выбрали конкретный тип вместо a
, то есть, мы гарантированно закрепили a
либо Float
или Double
(или наш пользовательский тип который имеет экземпляры как Fractional
, так и Eq
) во время компиляции, и поэтому нет никакой двусмысленности.
Но это просто чувство, и я не знаю, является ли оно на 100% точным.
@ Карстен. Совсем неважно, что оба находятся в 'Eq'; это незаконно, потому что выбор одного может дать другой результат от другого (для этой программы это, конечно, не будет, но компилятор не знает и не должен этого знать). –
@AlexeyRomanov хорошо извините ... – Carsten
Можете ли вы сказать, почему это не дубликат [вашего предыдущего вопроса] (http://stackoverflow.com/q/34776282/791604)? –