[Haskell-cafe] what is wrong w my IORef Word32 ?

Edward Z. Yang ezyang at MIT.EDU
Thu Jul 18 19:19:53 CEST 2013


shiftL has the wrong type:  Bits a => a -> Int -> a
so it is expecting the value in the IORef to be an Int.

Edward

Excerpts from Joerg Fritsch's message of Thu Jul 18 10:08:22 -0700 2013:
> All, what is wrong w the below code?
> 
> I get an type error related to the operation shiftL
> 
> import Data.Bits
> import Data.Word
> import Data.IORef
> 
> data Word32s = Word32s { x :: IORef Word32 }
> 
> bitfield :: Word32
> bitfield = 0
> 
> mkbitfield :: Word32 -> IO Word32s
> mkbitfield i = do the_bf <- newIORef i
>                   return (Word32s the_bf)
> 
> sLbitfield :: Integer -> Word32s -> IO ()
> sLbitfield i (Word32s bf) = do modifyIORef bf (shiftL i)
> 
> main::IO()
> main = do
>      oper_bf <- mkbitfield bitfield 
>      sLbitfield 2 oper_bf
> 
> 
> 
> bf_003.hs:15:48:
>     Couldn't match type `Int' with `Word32'
>     Expected type: Word32 -> Word32
>       Actual type: Int -> Word32
>     In the return type of a call of `shiftL'
>     In the second argument of `modifyIORef', namely `(shiftL i)'
>     In a stmt of a 'do' block: modifyIORef bf (shiftL i)
> 
> bf_003.hs:15:55:
>     Couldn't match expected type `Word32' with actual type `Integer'
>     In the first argument of `shiftL', namely `i'
>     In the second argument of `modifyIORef', namely `(shiftL i)'
>     In a stmt of a 'do' block: modifyIORef bf (shiftL i)
> 
> 
> 
> Thanks,
> --Joerg
> 




More information about the Haskell-Cafe mailing list