Проблема с плавающим

#haskell

#haskell

Вопрос:

Прошу прощения, если эта проблема действительно прямолинейна, но я немного повозился со случайным фрагментом кода, который я создал, и мне любопытно, почему следующее не будет скомпилировано:

 test::Floating a => Int -> [a]
test x = map(y -> (y * abs(cos(y)))) [0..x]
 

Я пытаюсь понять большинство классов типов, и я подумал об использовании Floating, поскольку мы используем cosine. Цель функции — составить список от 0 до x с помощью следующей функции: y -> (y * abs(cos(y)))

Однако компилятор жалуется на тип x («Не удалось сопоставить тип ‘a’ с ‘Int'»), говоря, что он ожидает тип [a], но получает [Int] . Почему это так? В конце концов, я передаю эти целые числа в свою анонимную функцию, чтобы получить список чисел с плавающей запятой.

Комментарии:

1. поскольку x является an Int , это означает [0..x] , что это список Int s, и, следовательно y , также является an Int , поскольку все функции типа (*) :: Num a => a -> a -> a требуют, чтобы два операнда и результат были одного и того же типа, таким образом, это не сработает.

2. Имеет смысл, спасибо!

Ответ №1:

поскольку x является an Int , это означает [0..x] , что это список Int s, и, следовательно y , также является an Int , поскольку все функции типа (*) :: Num a => a -> a -> a требуют, чтобы два операнда и результат были одного и того же типа, таким образом, это не сработает.

Однако вы можете использовать fromIntegral :: (Integral a, Num b) => a -> b для преобразования числа Integral типа в любой Num тип:

 test :: Floating a => Int -> [a]
test x = map(y -> let yf = fromIntegral y in yf * abs (cos yf)) [0..x]