2009-09-09 2 views
10

Я по-прежнему новичок и пытаюсь создать список для использования в функции и хочу, чтобы он был как можно меньшим, чем logBase x y. , но мне трудно получить logBase во что-то, что я могу использовать в этом списке.Haskell конвертирует Float в Int

[1 .. (logBase х у)]

Любые предложения?

ответ

10

Вы не после того, что ошибка типа вы получите, но я предполагаю, что это что-то вроде этого:

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 

возвращает тип в перемещаемом классе , тогда как другие переменные в вашей программе (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] 

Использовать усечение, клей или пол.

2

Возможно, вам нужна какая-то функция округления, усечения, пола или потолка. Ints и Floats - это разные типы (как вы видели), и компилятор не позволит вам их смешивать. Я найду ссылку через минуту.

8

Возможно, вам нужен один из списка функций here. Hoogle и Hayoo! - отличные инструменты для такого рода вещей, поскольку они позволяют вам вводить тип функции, которую вы хотите, и возвращать список функций. Благодаря богатой системе Haskell это может быть очень полезным инструментом, гораздо более важным, чем динамически типизированные языки или даже статически типизированные языки, такие как C или Java.