Haskell Read (no instance) -
i haskell beginner , have weird question. until has been going great, , have been able use prelude read function normally. have declare it's type in order use it.
i have declare or similar in order use it.
let r = read::string-> int
i have tried restarting ghci thinking have accidentally overloaded read whenever try using such
read "456"
i following error
no instance (read a0) arising use of `read' type variable `a0' ambiguous possible fix: add type signature fixes these type variable(s) note: there several potential instances: instance read () -- defined in `ghc.read' instance (read a, read b) => read (a, b) -- defined in `ghc.read' instance (read a, read b, read c) => read (a, b, c) -- defined in `ghc.read' ...plus 25 others in expression: read "456" in equation `it': = read "456"
does have ideas causing , how fix it?
first, solve problem, specify result expect read
in 1 of few ways:
first, specifying type of result of entire computation:
read "456" :: int
or specifying type of function read:
(read :: string -> int) "456"
to explain why happens, issue read
polymorphic in result type. is, there many different read
functions defined, , defined part of typeclass read
. error gives explanation why:
possible fix: add type signature fixes these type variable(s) note: there several potential instances: instance read () -- defined in `ghc.read' instance (read a, read b) => read (a, b) -- defined in `ghc.read' instance (read a, read b, read c) => read (a, b, c) -- defined in `ghc.read' ...plus 25 others
the read
typeclass defined many, many types, says there 28 instances defined in error. it's defined int, , integer, , double, , string, , countless others. , in order compiler know instance of typeclass use, needs able infer type of read
specify. if give :: string -> int
, compiler can figure out.
to understand how works, let's @ part of type class read
:
class read read :: string ->
so given type a
, instance of read a
must defined in order function read
return value of type a
. int
, there definition instance of read int
, , indeed there in ghc-read. instance defines how read
works. unfortunately, instance rather obtuse , relies on other functions , other such things, sake of completeness, here is:
instance read int readprec = readnumber convertint readlistprec = readlistprecdefault readlist = readlistdefault
but, important thing realize instance means read
work int
. shortly after, there's instance:
instance read double readprec = readnumber convertfrac readlistprec = readlistprecdefault readlist = readlistdefault
oh dear. read
works int
, double
!
the haskell language ensures compiler will, usually, try infer unique type value or fail. there odd exceptions extensions language in ghc, have remember here haskell trying prevent shooting in foot. if don't specify somehow type you're expecting read
, compiler infer any type, might not valid. wouldn't want code start reading in floating point double
s or arbitrary precision integer
s expected read in int
, right?
in case, not specifying type merely caused compiler give up, couldn't definitively answer question asked to, is, "which instance of read
use?" , haskell compilers do not guessing. 1 way prevent guessing use value in way unambiguous later, or define function uses read
unambiguously. example, function can used in code avoid having type :: string -> int
:
readint :: string -> int readint = read
the compiler can figure out instance of read
needs use there, , in code if do:
readint "456"
the compiler know readint
has type string -> int
, , readint "456"
has type int
. unambiguous, haskell likes it.
addendum
the syntax in ghci bit different defining things, if using ghci exclusively play around haskell, i'd recommend switch loading .hs files , using :r
command reload them. 1 problem ghci have define "let" start feel strange when start writing programs, top level definitions don't need that. problem monomorphism restriction which, frankly, kind of weird , quirky , it's not worth going detail here.
anyhow, syntax defining readint
above in ghci simple, though there 2 ways (equivalent). know one, this:
let readint = read :: string -> int
the other way define function , type separately, more akin how done in regular .hs file:
let readint :: string -> int; readint = read
neither idiomatic haskell, that's because ghci imposes quirky limitations on writing code , multi-line entry strange. this:
:{ let readint :: string -> int; readint = read :}
and close idiomatic haskell definition. ghci correctly compile initial example if put in .hs file , use :load
or specify file ghci ./somefile.hs
.
Comments
Post a Comment