En la biblioteca de concurrencia GHC.Conc hay una función llamada numCapabilities
. Su tipo es numCapabilities :: Int
y en realidad devuelve un número que pasó por el indicador de línea de comando (por ejemplo, 5
si las opciones son +RTS -N 5
).¿Por qué numCapabilities es una función pura?
Sin embargo, getArgs
(tipo: IO [String]
) hace esencialmente lo mismo (devuelve los argumentos no en tiempo de ejecución no analizados) pero no es una función pura.
Si la única excusa es que a menudo se necesita numCapabilities
en código puro, ¿de qué manera no son necesarias otras opciones de línea de comando en código puro?
¿Me falta algo o es numCapabilities
un error de diseño o puedo escribir el siguiente monstruo?
myGetArgs = unsafePerformIO getArgs
ahora estoy preguntando lo contrario: Como el valor de 'getArgs' nunca cambia durante la ejecución de su programa, no estoy muy seguro de por qué se necesita/debe estar en' IO'. – sepp2k
Como se menciona en una de las respuestas, depende de cómo se define una expresión _pure_. Definiría una expresión como _pure_ iff no depende de nada más que la expresión misma. Según esta definición, 'numCapabilities' no es puro, por lo que tener un tipo de' Int' debe considerarse como un defecto de diseño. Puede que le interese la publicación de blog de Conal Elliott [Nociones de pureza en Haskell] (http://conal.net/blog/posts/notions-of-purity-in-haskell). –
'numCapabilities' no necesita devolver el valor dado a' -N' - simplemente llama a 'getNumCapabilities', por lo que devuelve todas las capacidades que haya en el momento. Creo que esto es un error, pero es difícil decir qué garantías puedes confiar en los módulos de GHC. –