Doubt regarding Types

Artie Gold artiegold at austin.rr.com
Mon Nov 3 21:54:28 EST 2003


Hal Daume III wrote:
> Hi,
> 
> On Mon, 3 Nov 2003, Karthik Kumar wrote:
> 
>>-- Convert a string to an integer.
>>-- This works perfectly fine. 
>>atoi          :: [Char] -> Int
>>atoi (h : []) = if isDigit h then digitToInt h else 0
>>atoi (h : t) =  if isDigit h then digitToInt h * ( 10 ^ length t) +
>>atoi t else 0
> 
> 
> you can use "read" for this.
> 
> 
>>-- validateBoardSize
>>-- To validate the board size
>>validateBoardSize   :: Int -> Bool
>>validateBoardSize d = (d == 9 || d == 13 || d == 19 ) 
> 
> 
> this looks fine
> 
> 
>>getBoardSize :: IO Bool 
>>-- TODO : What could be the type of getBoardSize 
>>getBoardSize  = do c <- getLine
>>                   validateBoardSize ( atoi c ) 
>>
>>ERROR "test1.hs":21 - Type error in final generator
>>*** Term           : validateBoardSize (atoi c)
>>*** Type           : Bool
>>*** Does not match : IO a
> 
> 
> this is telling you something important.  it's saying that the final 
> generator, "validateBoardSize (atoi c)" has type Bool, but it's expecting 
> it to have type IO something.  You need to "lift" the pure Bool value into  
> IO by saying return:
> 
> 
>>getBoardSize = do
>>   c <- getLine
>>   return (validateBoardSize (read c))
> 
> 

Of course the board size is now lost and gone forever (and a 
function called `getBoardSize' returning an IO Bool is, well, a 
little counterintuitive). ;-)

To the OP: What does the top level code look like?[1] That should 
guide the rest of the design.

HTH,
--ag

[1] The question is rhetorical.
-- 
Artie Gold -- Austin, Texas
Oh, for the good old days of regular old SPAM.



More information about the Haskell-Cafe mailing list