Для больше подробно смотрят на дизайн pattners, необходимо посмотреть Шаблоны разработки: Элементы Допускающего повторное использование Объектно-ориентированного программного обеспечения . Исходный код не находится в Python, но это не должно быть для Вас для понимания шаблонов.
Вы не публикуете ошибку типа, которую получаете, но я предполагаю, что это примерно так:
Prelude> let x = 2
Prelude> let y = 7
Prelude> [1 .. (logBase x y)]
<interactive>:1:7:
No instance for (Floating Integer)
arising from a use of `logBase' at <interactive>:1:7-17
Possible fix: add an instance declaration for (Floating Integer)
In the expression: (logBase x y)
In the expression: [1 .. (logBase x y)]
In the definition of `it': it = [1 .. (logBase x y)]
Проблема в том, что:
Prelude> :t logBase
logBase :: (Floating a) => a -> a -> a
возвращает тип в классе Floating, а другие переменные в вашей программе (1, 'x', 'y') относятся к целочисленному типу.
Я полагаю, вам нужна последовательность целых чисел?
Prelude> :set -XNoMonomorphismRestriction
Prelude> let x = 2
Prelude> let y = 42
Prelude> [1 .. truncate (logBase x y)]
[1,2,3,4,5]
Используйте truncate, celing или floor.
Вероятно, вам понадобится одна из функций списка здесь . Hoogle и Hayoo! - отличные инструменты для такого рода вещей, поскольку они позволяют вам указать тип функции, которую вы хотите, и получить обратно список функций. С системой расширенных типов Haskell это может быть очень полезным инструментом, гораздо более полезным, чем языки с динамической типизацией или даже языки со статической типизацией, такие как C или Java.
Возможно, вам понадобится функция округления, усечения, пола или потолка. Ints и Floats - это разные типы (как вы видели), и компилятор не позволит вам смешивать их. Я найду ссылку через минуту.