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}
%