2009-09-09 12 views
10

Nadal jestem nowy i próbuję utworzyć listę do użycia w funkcji i chcę, aby była tak mała, jak to tylko możliwe, czyli logBase xy. ale mam problemy z uzyskaniem logBase do czegoś, czego mogę użyć na tej liście.Konwersja Haskell Float na Int

[1 .. (logBase X Y)]

sugestie?

Odpowiedz

10

Nie zakładać, jakiego rodzaju błąd pojawi się, ale wyobrażam sobie, że jest coś takiego:

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)] 

Problem polega na tym, że:

Prelude> :t logBase 
logBase :: (Floating a) => a -> a -> a 

zwraca typ w klasie Pływające , podczas gdy inne zmienne w twoim programie (1, "x", "y") są typu integralnego.

Zakładam, że chcesz ciąg liczb całkowitych?

Prelude> :set -XNoMonomorphismRestriction 
Prelude> let x = 2 
Prelude> let y = 42 
Prelude> [1 .. truncate (logBase x y)] 
[1,2,3,4,5] 

Użyj obcięte, celing lub podłogi.

2

Prawdopodobnie potrzebujesz funkcji zaokrąglania, ścięcia, podłogi lub sufitu. Ints i float są różnymi typami (jak widzieliśmy), a kompilator nie pozwoli ci ich zmiksować. Znajdę referencję za minutę.

8

Prawdopodobnie chcesz jedną z list funkcji here. Hoogle i Hayoo! są świetnymi narzędziami do tego typu rzeczy, ponieważ pozwalają na wpisanie odpowiedniego typu funkcji i uzyskanie listy funkcji. Dzięki bogatemu systemowi Haskella może to być bardzo pomocne narzędzie, znacznie bardziej niż języki dynamicznie pisane, a nawet statycznie napisane języki takie jak C lub Java.