計算機科学のブログ

Haskell - コンテキストでの型の操作 - コンテキストとしてのリスト:Applicative型クラスをさらに掘り下げる - コンテキストとしてのリスト - 大量のテストデータをすばやく生成する

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)の UNIT5(コンテキストでの型の操作)、LESSON 29(コンテキストとしてのリスト:Applicative型クラスをさらに掘り下げる)、29.3(コンテキストとしてのリスト)、クイックチェック 29-5の解答を求めてみる。

コード

sample5.hs

main :: IO ()
main = do
    mapM_ print $
        pure User <*> testNames <*> testIds <*> testScores

data User = User {
    name :: String,
    gamerId :: Int,
    score :: Int } deriving Show

testNames :: [String]
testNames = [
    "John Smith",
    "Robert'); drop table students;--",
    "Christina null",
    "Randall Munroe",
    "日本語"
    ]

testIds :: [Int]
testIds = [
    1337,
    0123,
    999999
    ]

testScores :: [Int]
testScores = [
    0,
    100000,
    -99999
    ]

入出力結果(Terminal, Zsh)

% runghc sample5.hs
User {name = "John Smith", gamerId = 1337, score = 0}
User {name = "John Smith", gamerId = 1337, score = 100000}
User {name = "John Smith", gamerId = 1337, score = -99999}
User {name = "John Smith", gamerId = 123, score = 0}
User {name = "John Smith", gamerId = 123, score = 100000}
User {name = "John Smith", gamerId = 123, score = -99999}
User {name = "John Smith", gamerId = 999999, score = 0}
User {name = "John Smith", gamerId = 999999, score = 100000}
User {name = "John Smith", gamerId = 999999, score = -99999}
User {name = "Robert'); drop table students;--", gamerId = 1337, score = 0}
User {name = "Robert'); drop table students;--", gamerId = 1337, score = 100000}
User {name = "Robert'); drop table students;--", gamerId = 1337, score = -99999}
User {name = "Robert'); drop table students;--", gamerId = 123, score = 0}
User {name = "Robert'); drop table students;--", gamerId = 123, score = 100000}
User {name = "Robert'); drop table students;--", gamerId = 123, score = -99999}
User {name = "Robert'); drop table students;--", gamerId = 999999, score = 0}
User {name = "Robert'); drop table students;--", gamerId = 999999, score = 100000}
User {name = "Robert'); drop table students;--", gamerId = 999999, score = -99999}
User {name = "Christina null", gamerId = 1337, score = 0}
User {name = "Christina null", gamerId = 1337, score = 100000}
User {name = "Christina null", gamerId = 1337, score = -99999}
User {name = "Christina null", gamerId = 123, score = 0}
User {name = "Christina null", gamerId = 123, score = 100000}
User {name = "Christina null", gamerId = 123, score = -99999}
User {name = "Christina null", gamerId = 999999, score = 0}
User {name = "Christina null", gamerId = 999999, score = 100000}
User {name = "Christina null", gamerId = 999999, score = -99999}
User {name = "Randall Munroe", gamerId = 1337, score = 0}
User {name = "Randall Munroe", gamerId = 1337, score = 100000}
User {name = "Randall Munroe", gamerId = 1337, score = -99999}
User {name = "Randall Munroe", gamerId = 123, score = 0}
User {name = "Randall Munroe", gamerId = 123, score = 100000}
User {name = "Randall Munroe", gamerId = 123, score = -99999}
User {name = "Randall Munroe", gamerId = 999999, score = 0}
User {name = "Randall Munroe", gamerId = 999999, score = 100000}
User {name = "Randall Munroe", gamerId = 999999, score = -99999}
User {name = "\26085\26412\35486", gamerId = 1337, score = 0}
User {name = "\26085\26412\35486", gamerId = 1337, score = 100000}
User {name = "\26085\26412\35486", gamerId = 1337, score = -99999}
User {name = "\26085\26412\35486", gamerId = 123, score = 0}
User {name = "\26085\26412\35486", gamerId = 123, score = 100000}
User {name = "\26085\26412\35486", gamerId = 123, score = -99999}
User {name = "\26085\26412\35486", gamerId = 999999, score = 0}
User {name = "\26085\26412\35486", gamerId = 999999, score = 100000}
User {name = "\26085\26412\35486", gamerId = 999999, score = -99999}
%