Home About Contact
Haskell , Deno

サンプルデータとして氏名を大量に生成したい

サンプルデータとして氏名を大量に用意する必要が生じた。 deno , haskell で試す。

方針としては 苗字と名前のリストをつくってそれらの組み合わせで大量の氏名をつくる。

TypeScript (Deno)

バージョンを確認:

$ deno --version
deno 2.4.1 (stable, release, x86_64-unknown-linux-gnu)
v8 13.7.152.6-rusty
typescript 5.8.3

ためしに名前と苗字を2つずつ用意:

const firstNames: string[] = ['賢治', '太郎']
const lastNames: string[] = ['田中', '小林']

これらの直積(Cartesian Product)をとればよい:

const names = product([lastNames, firstNames])

product 関数は以前の セルのアドレス生成をもっと簡単に計算したいを参照。

結果を出力:

names.forEach((it)=>{
  console.log( it )
})

実行してみる。

$ deno main.ts 
[ "田中", "賢治" ]
[ "田中", "太郎" ]
[ "小林", "賢治" ]
[ "小林", "太郎" ]

あとは、 firstNames と lastNames を必要なだけ増やせばよい。 Claude Sonnet さんなどにきけばいくらでも生成してくれる。

完成したコード:

import product from "npm:cartesian-product"

const firstNames: string[] = ['賢治', '太郎',]
const lastNames: string[] = ['田中', '小林',]

const names = product([lastNames, firstNames])
names.forEach((it)=>{
  console.log( it )
})

Haskell (GHC)

バージョンを確認:

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 9.4.7

名前と苗字を定義:

firstNames = ["賢治", "太郎"]
lastNames = ["田中", "小林"]

product' 関数:

c lastName firstName = (lastName, firstName)
product' xs ys = pure c <*> xs <*> ys

ghci で実行してみます:

$ ghci
GHCi, version 9.4.7: https://www.haskell.org/ghc/  :? for help
ghci> firstNames = ["賢治", "太郎"]
ghci> lastNames = ["田中", "小林"]
ghci> c lastName firstName = (lastName, firstName)
ghci> product' xs ys = pure c <*> xs <*> ys
ghci> names = product' lastNames firstNames
ghci> names
[("\30000\20013","\36066\27835"),("\30000\20013","\22826\37070"),("\23567\26519","\36066\27835"),("\23567\26519","\22826\37070")]
ghci> 

肝心の名前部分が 変な表示になっているけど意図通り作動してそう。

エスケープシーケンスされた文字列の 解消方法: 日本語をshowしてうまく表示されなかったら

タプルのリストを文字列のリストにかえる toListString や putStrLn で表示できるように 文字列のリストをカンマ区切りの文字列にかえる fix などのヘルパー関数を追加して完成したコード:

firstNames = ["賢治", "太郎"]
lastNames = ["田中", "小林"]

c lastName firstName = (lastName, firstName)

product' xs ys = pure c <*> xs <*> ys

fix :: [String] -> String
fix xs = foldl1 (\x y -> x ++ "," ++ y) xs

toListString :: [(String, String)] -> [String]
toListString xs = map (\x -> fst x ++ snd x) xs

main :: IO ()
main = putStrLn $ fix (toListString $ product' lastNames firstNames)

実行:

$ ghc main.hs
$ ./main
田中賢治,田中太郎,小林賢治,小林太郎

以上です。