Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813

    [haskell] conversione binaria

    Ciao a tutti,
    non so se qualcuno ne parla in questo forum, ma ho un problema con questo (come lo definisco io) mental programming language chiamato Haskell.
    Premetto che lo sto imparando per un corso universitario e, quindi, sono forzato.
    A prescindere tutto

    codice:
    binaryConversion x      | x == 0 = []
    		        	| x == 1 = [1]
    				| otherwise = (mod x 2):binaryConversion (floor (x/2))
    questa funzione dovrebbe restituire la conversione binaria di un numero naturale (a meno di un reverse della lista, ma non è quello che mi interessa).

    Quando lo carico su hugs tutto apposto, se non che

    Main> binaryConversion 10
    ERROR - Unresolved overloading
    *** Type : (RealFrac a, Integral a) => [a]
    *** Expression : binaryConversion 10

    Ho provato a fare
    binaryConversion :: (Integral a) => a->[b]
    non c'è verso
    e adesso non so più veramente dove sbattere la testa...spero che c'è qualcuno che ne capisca di programmazione funzionale.
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  2. #2
    Utente di HTML.it L'avatar di toraz
    Registrato dal
    Nov 2001
    Messaggi
    263
    Se controlli il tipo che inferisce il compilatore con il comando :type vedrai che e` (RealFrac a, Integral a) => a -> [a]. Il problema e` che ovviamente non trova un tipo che sia sia un'istanza di RealFrac e di Integral.
    Per risolvere il problema devi riscrivere la funzione usando delle funzioni della classe Integral, ovvero

    codice:
    bConv x | x == 0 = [0]
                   | x == 1 = [1]
                   | otherwise = (mod x 2) : bConv (div x 2)
    il cui tipo e` (Integral a) => a -> [a]



    Non prenderlo per oro colato, ma il principio a grandi linee dovrebbe essere questo.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    uhmmm
    ti ringrazio perché funziona, però mi piacerebbe capire ESATTAMENTE perché non funziona...cmq perlomeno adesso posso completare l'esercizio....spero di ricordarmi questa domanda la sett prox a lezione
    cheers
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  4. #4
    Utente di HTML.it L'avatar di toraz
    Registrato dal
    Nov 2001
    Messaggi
    263
    Tento di spiegarti meglio che posso, con una funzione un po' piu` semplice...

    Prendi le funzioni
    codice:
    f x = floor (x / 2)
    g x = mod x 2
    che sono rispettivamente di tipo
    codice:
    f :: (RealFrac a, Integral b) => a -> b
    g :: (Integral a) => a -> a
    Ora se le metti insieme (togliendo di mezzo la ricorsione, perche' non ho idea di come faccia il compilatore a inferire il tipo di una funziona ricorsiva)
    codice:
    h x = (g x, f x)
    Ottieni che h e` di tipo
    codice:
    (RealFrac a, Integral a, Integral b) => a -> (a, b)
    Ovvero il compilatore si aspetta come parametro un valore di un tipo che sia allo stesso tempo un'istanza di RealFrac (Float o Double) e di Integral (Int o Integer), siccome non esiste un tipo del genere ti da l'errore.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    Grazie per la spiegazione
    Originariamente inviato da toraz
    Ora se le metti insieme (togliendo di mezzo la ricorsione, perche' non ho idea di come faccia il compilatore a inferire il tipo di una funziona ricorsiva)
    Questo credo di saperlo io...
    haskell ha una strategia di valutazione delle espressione di tipo lazy, ovver lui valuta il più tardi possibile e (questo non so veramente come faccia) valuta le funzioni ricorsive il minimo indispensabile. Tant'è vero che con haskell puoi fare operazioni su insiemi infiniti.
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.