Я хочу написать функцию, которая вычисляет изменение при задании количества монет. Он отлично поработал, за исключением случаев, когда я действительно хочу, чтобы входные данные были Double, а не Int.«Преобразование» Двойной к Int
Это мой код
coins::[Int]
coins = [200, 100, 50, 20, 10, 5, 2, 1]
change::Int->[Int]->[Int]
change n [] = []
change n coins
| n == 0 = []
| n >= firstcoin = firstcoin:change (n-firstcoin) coins
| otherwise = change n (tail coins)
where firstcoin = head coins
Это работает хорошо и все, но когда я пытаюсь изменить код, чтобы:
change::Double->[Int]->[Int]
| (n*100) == 0 = []
| (n*100) >= firstcoin = firstcoin:change (n-firstcoin) coins
| otherwise = change n (tail coins)
where firstcoin = head coins
происходит следующее:
[1 of 1] Compiling Main (coin.hs, interpreted)
coin.hs:7:27:
Couldn't match expected type ‘Double’ with actual type ‘Int’
In the second argument of ‘(>=)’, namely ‘firstcoin’
In the expression: (n * 100) >= firstcoin
coin.hs:7:59:
Couldn't match expected type ‘Double’ with actual type ‘Int’
In the second argument of ‘(-)’, namely ‘firstcoin’
In the first argument of ‘change’, namely ‘(n - firstcoin)’
Failed, modules loaded: none.
Это например, используя «/», где я должен использовать fromIntegral заранее? Если да, то как это переводится здесь?
* Немного сторона вопрос: как я могу сделать список монет, написанных здесь «вкладывается» в функцию так, что подпись будет выглядеть следующим образом:
change::Int->[Int]
(другими словами, я не хочу явно написать в списке, чтобы он работал. Мне нужно было бы изменить весь код?)
Одним из первых правил обращения с валютой является не использование значений с плавающей запятой для представления суммы денег. – chepner
Не могли бы вы рассказать? Я не понимаю. – Rad
Значения с плавающей запятой - это просто аппроксимации действительных чисел. Вы бы не делали изменений для некоторой нечеткой доли доллара; вы делаете изменения для точного целого числа центов. – chepner