Le variabili possono essere trattate come costanti in Haskell?

4

Questa è una domanda imbarazzante di base, ma fino a poco tempo fa ho evitato di comprendere correttamente l'IO in Haskell e ora ho bisogno di farlo.

Sto scrivendo (con qualcun altro) un programma che prende come parte del suo input una libreria di dati di background. Quindi come parte di main avrò un paio di righe come

lib <- library.txt
let library = interpret lib

Cioè, legge la libreria da un file di testo e poi la analizza per creare una libreria con la struttura giusta necessaria per il programma. In particolare, il tipo di "interpretare" sarà

interpret :: String -> Library

La mia domanda ora è questa. C'è un modo per il programma di trattare la libreria come una costante? Il programma conterrà funzioni il cui comportamento dipende da cosa c'è nella libreria, quindi sembra che si debba dare una funzione di questo tipo come

foo :: Library -> Type1 -> Type2

e includi sempre library come uno degli argomenti di foo . Ma è un po 'noioso quando foo sarà sempre applicato solo a library e non ad altre librerie di tipo Library . Mi piacerebbe essere in grado di trattare library come farei con una costante come 2 (l'analogia è che la funzione che prende da x a x + 2, ad esempio, ha tipo Int -> Int piuttosto che Int -> Int -> Int ). Funzionerà se invece dò a foo il tipo Type1 -> Type2 e poi consenti la definizione di foo x per menzionare library ? In caso contrario, c'è un altro modo per ottenere la stessa cosa?

    
posta user15553 29.09.2016 - 14:12
fonte

1 risposta

1

Se le informazioni sulla libreria sono necessarie in fase di esecuzione, è necessario rappresentarle nei tipi. Non è una costante per definizione, quindi devi esprimerla nelle tue funzioni.

Puoi ottenere livelli più semplici di riutilizzo del codice utilizzando però la monade Reader per collegare questa dipendenza al programma.

    
risposta data 29.09.2016 - 14:29
fonte

Leggi altre domande sui tag