Existe uma boa razão para o tipo de Prelude.read ser
read :: Read a => String -> a
em vez de retornar um Maybe
valor?
read :: Read a => String -> Maybe a
Já que a string pode não ser analisável por Haskell, o último não seria mais natural?
Ou até mesmo um Either String a
, onde Left
conteria a string original se não fosse analisada eRight
o resultado se sim?
Editar:
Não estou tentando fazer com que outras pessoas escrevam um wrapper correspondente para mim. Apenas buscando a garantia de que é seguro fazer isso.
take
aceita nenhumNum a => a
? Por que existe um caso especial defmap
listas para? Por queFunctor
não é necessário paraMonad
instâncias? Espero que a resposta seja semelhante às respostas a essas perguntas e outras relacionadas.readMaybe
função seja adicionada em breve.take
serIntegral n => n -> [a] -> [a]
?Integral
, nãoNum
- peido cerebral.Respostas:
Editar : a partir do GHC 7.6,
readMaybe
está disponível noText.Read
módulo no pacote básico, junto comreadEither
: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v: readMaybeÓtima pergunta! O tipo de leitura em si não mudará tão cedo porque isso quebraria muitas coisas. No entanto, deve haver um
maybeRead
função.Por que não existe? A resposta é "inércia". Houve uma discussão em '08 que foi prejudicada por uma discussão sobre "fracasso".
A boa notícia é que as pessoas estavam suficientemente convencidas para começar a se afastar do fracasso nas bibliotecas. A má notícia é que a proposta se perdeu na confusão. Não deve ser tal função um, embora um seja fácil de escrever (e existem zilhões de versões muito semelhantes flutuando muitas bases de código).
Veja também esta discussão .
Pessoalmente, uso a versão do pacote seguro .
fonte
Sim, seria útil com uma função de leitura que retornasse Maybe. Você mesmo pode fazer um:
fonte
Read a
typeclass:readMaybe :: Read a => String -> Maybe a
Além da inércia e / ou mudanças nas percepções, outro motivo pode ser o fato de ser esteticamente agradável ter uma função que pode atuar como uma espécie de inverso de
show
. Ou seja, você deseja queread . show
seja a identidade (para tipos que são uma instância deShow
eRead
) e queshow . read
seja a identidade no intervalo deshow
(ou seja,show . read . show == show
)Ter um
Maybe
no tipo deread
quebra a simetria comshow :: a -> String
.fonte
newtype ValidShow a = ValidShow String
. O tipo fantasma torna mais seguro o tipo.showThing :: Show a => a -> ValidShow a
ereadThing :: Read a => ValidShow a -> a
, para que o tipo da coisa que foi mostrada seja lembrada no objeto ValidShow. Assim você não pode escreverreadThing (showThing True) :: String
.Como @augustss apontou, você pode criar sua própria função de leitura segura. No entanto, seu
readMaybe
não é totalmente consistente com read, já que não ignora os espaços em branco no final de uma string. (Cometi este erro uma vez, não me lembro bem do contexto)Olhando para a definição de leitura no relatório Haskell 98 , podemos modificá-la para implementar um
readMaybe
que seja perfeitamente consistente comread
, e isso não é muito inconveniente porque todas as funções das quais depende estão definidas no Prelúdio:fonte
safe
pacote, obterá uma versão correta doreadMaybe
disponível (é chamadoreadMay
e é idêntico a esta versão.Esta função (chamada
readMaybe
) está agora no prelúdio de Haskell! (A partir da base atual - 4,6)fonte