はじめてのHaskell

全然Haskellやってないのだった。


a-zのアルファベット26文字を表示するプログラム

import Foreign.Marshal.Alloc
import Foreign.Marshal.Pool
import Foreign.Storable
import Foreign.C.String
import Foreign.Storable

main = withPool $ \p->
       do { a <- pooledMallocBytes p 27
          ; mapM (\n -> pokeElemOff a n ((castCharToCChar 'a') + (fromIntegral n))) [0..25]
          ; s <- peekCString a
          ; putStrLn s }

ふむ…

import Foreign.Marshal.Alloc
import Foreign.C.String
import Foreign.C.Types
import Foreign.Storable
import Foreign.Ptr

foreign import ccall unsafe "puts" _puts :: Ptr CChar -> IO ()

main = allocaBytes 32 $ set
       where
         set :: Ptr CChar -> IO()
         set p = do { pokeElemOff p 0 65
                    ; pokeElemOff p 1 66
                    ; pokeElemOff p 2 67
                    ; pokeElemOff p 3 68
                    ; pokeElemOff p 4 0
                    ; _puts p
                    }

こういうコードをコンパイルすると、

*((StgWord8*)(_s1DE)) = (StgWord8)(0x41U);
*((StgWord8*)(_s1DE+1)) = (StgWord8)(0x42U);
*((StgWord8*)(_s1DE+2)) = (StgWord8)(0x43U);
*((StgWord8*)(_s1DE+3)) = (StgWord8)(0x44U);
*((StgWord8*)(_s1DE+4)) = (StgWord8)(0x0);
CALLER_SAVE_SYSTEM
puts((void *)_s1DE);
CALLER_RESTORE_SYSTEM

こんな感じのコードになるのを見ると、Haskellってうまく書けば、なんかそんな感じにうまくいくのかなー、とか思う。