[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