Я просто переживаю «Real World Haskell», и я делаю упражнения, которые приходят вместе с ним.Haskell fromIntegral - путаница типа
И я заметил что-то, что я считаю странным.
Возьмите эту функцию, например:
myAverage :: (Fractional a) => [a] -> Maybe a myAverage [] = Nothing myAverage xs = Just $ (mySum xs)/(fromIntegral $ myLength xs)
(/)
функция хочет два аргумента, которые являются экземплярами Fractional
. myLength
возвращает Int
, поэтому я использую функцию the fromIntegral
, как мне сказали.
Но fromIntegral
только гарантирует, что возвращаемое значение будет экземпляром Num
.
Почему Num
также «включает» экземпляр Fractional
в этом случае. Разве это не Fractional
?
Почему компилятор не жалуется, что у меня есть только Num
от типа возврата, а не «правильный» Fractional
.
Почему я не могу использовать Int
напрямую, это также пример Num
, не так ли?
В случае звонка mySum
я получаю его. Он принимает список Num
s, но я передаю его со списком Fractional
s (также Num
s, потому что они получены от него). Возвращаемый тип имеет тот же тип, что видно из аннотации типа (смотрите ниже): один элемент Fractional
Но в случае fromIntegral
я не могу вывести себя (компилятор, очевидно, может :-)), что возвращаемый значение также является экземпляром Fractional
. Зачем? Тип, который требуется, явно не Fractional
.
Вся функция работает должным образом.
Просто для уточнения:
mySum :: (Num a) => [a] -> a myLength :: [a] -> Int
Спасибо,
Lazarus
Каковы ваши 'mySum' и' myLength'? Хорошо. Я вижу их сейчас. – ErikR
'mySum' просто добавляет все числа в список. 'myLength' подсчитывает элементы в списке. – Lazarus535