計算機科学のブログ

型の紹介 型の基礎 関数、型シグネチャ、文字列への変換と文字列からの変換を行う関数、複数の引数を持つ関数

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT2(型の紹介)、LESSON 11(型の基礎)、11.2(関数の型)のクイックチェック11-1、文字列への変換と文字列からの変換を行う関数のクイックチェック11-2、複数の引数を持つ関数のクイックチェック11-3の解答を求めてみる。

コード

-- クイックチェック11-1
halve :: Integer -> Integer
halve n = div n 2

-- クイックチェック11-2
printDouble:: Int -> String 
printDouble n = show (2 * n)

-- クイックチェック11-3
makeAddress :: Int -> String -> String -> (Int, String, String)
makeAddress number street town = (number, street, town)

-- 引数が一つ渡された関数の型シグネチャ
makeAddress1 :: String -> String -> (Int, String, String)
makeAddress1 = makeAddress 10

-- 引数がふたつ渡された関数の型シグネチャ
makeAddress2 :: String -> (Int, String, String)
makeAddress2 = makeAddress 10 "street"

入出力結果(Terminal, Zsh)

% ghci
GHCi, version 8.10.4: https://www.haskell.org/ghc/  :? for help
macro 'doc' overwrites builtin command.  Use ':def!' to overwrite.
(0.00 secs, 0 bytes)
(0.00 secs, 0 bytes)
Loaded GHCi configuration from /.../.ghc/ghci.conf
Prelude
λ> :load sample01.hs 
[1 of 1] Compiling Main             ( sample01.hs, interpreted )
Ok, one module loaded.
(0.09 secs,)
*Main
λ> map halve [1..10]
[0,1,1,2,2,3,3,4,4,5]
it :: [Integer]
(0.07 secs, 79,368 bytes)
*Main
λ> :load sample01.hs 
[1 of 1] Compiling Main             ( sample01.hs, interpreted )
Ok, one module loaded.
(0.03 secs,)
*Main
λ> map printDouble [-5..5]
["-10","-8","-6","-4","-2","0","2","4","6","8","10"]
it :: [String]
(0.00 secs, 102,248 bytes)
*Main
λ> :load sample01.hs 
[1 of 1] Compiling Main             ( sample01.hs, interpreted )
Ok, one module loaded.
(0.03 secs,)
*Main
λ> makeAddress1 "street" "town"
(10,"street","town")
it :: (Int, String, String)
(0.00 secs, 75,360 bytes)
*Main
λ> makeAddress2 "town"
(10,"street","town")
it :: (Int, String, String)
(0.00 secs, 75,368 bytes)
*Main
λ> :quit
Leaving GHCi.
%