#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
является anInt
, это означает[0..x]
, что это списокInt
s, и, следовательноy
, также является anInt
, поскольку все функции типа(*) :: 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]