如何在Haskell中重构这些代码



我编写了这个简单的代码,在终端上绘制字母。如何重构主要使用前奏函数的代码?当然,也可以使用其他库。

import Data.Char
letterDatabase = [
[
"AAAAA ",
"A   A ",
"AAAAA ",
"A   A ",
"A   A "
],
[
"BBBB  ",
"B   B ",
"BBBB  ",
"B   B ",
"BBBB  "
],
[
"CCCCC ",
"C     ",
"C     ",
"C     ",
"CCCCC "
],
[
"DDD   ",
"D  D  ",
"D   D ",
"D  D  ",
"DDD   "
],        
[
"EEEEE ",
"E     ",
"EEEEE ",
"E     ",
"EEEEE "
],
[
"FFFFF ",
"F     ",
"FFFF  ",
"F     ",
"F     "
],            
[
"GGGGG ",
"G     ",
"G GGG ",
"G   G ",
"GGGGG "
],
[
"H   H ",
"H   H ",
"HHHHH ",
"H   H ",
"H   H "
],
[
" I  ",
" I  ",
" I  ",
" I  ",
" I  "
],
[
" JJJJ ",
"   J  ",
"   J  ",
"J  J  ",
"JJJJ  "
],
[
"K  K  ",
"K K   ",
"KK    ",
"K K   ",
"K  K  "
],
[
"L     ",
"L     ",
"L     ",
"L     ",
"LLLLL "
],
[
"MM MM ",
"M M M ",
"M   M ",
"M   M ",
"M   M "
],
[
"N   N ",
"NN  N ",
"N N N ",
"N  NN ",
"N   N "
],
[
"00000 ",
"O   O ",
"O   O ",
"O   O ",
"OOOOO "
],
[
"PPPPP ",
"P   P ",
"PPPP  ",
"P     ",
"P     "
],
[
"QQQQQ ",
"QQ  Q ",
"Q QQQ ",
"Q   Q ",
"QQQQ Q"
],
[
"RRRR  ",
"R   R ",
"RRRR  ",
"R R   ",
"R  R  "
],
[
"SSSSS ",
"S     ",
"SSSSS ",
"    S ",
"SSSSS "
],
[
"TTTTT ",
"  T   ",
"  T   ",
"  T   ",
"  T   "
],
[
"U   U ",
"U   U ",
"U   U ",
"U   U ",
"UUUUU "
],
[
"V   V ",
"V   V ",
"V   V ",
" V V  ",
"  V   "
],
[
"W   W ",
"W   W ",
"W   W ",
"W W W ",
"WW WW "
],
[
"X   X ",
" X X  ",
"  X   ",
" X X  ",
"X   X "
],
[
"Y   Y ",
" Y Y  ",
"  Y   ",
"  Y   ",
"  Y   "
],
[
"ZZZZZ ",
"   Z  ",
"  Z   ",
" Z    ",
"ZZZZZ "
]]
----------------------------------
draw :: String -> String
draw xs =  concatMap ((i, xs)-> concatMap ( x -> letterDatabase !! (ord (toUpper x) - 65) !! (i - 1)) xs ++ "n") (zip [1..5] (replicate 5 xs))
main = putStrLn $ draw "GAB"

拍摄:

draw = unlines . map concat . Data.List.transpose
     . map ((letterDatabase !!) . subtract 65 . ord . toUpper)

编辑:好吧,我猜我最初的击球更像高尔夫球hack而不是重构。以下是使用Array稍微不太容易出错的版本(我想我可以使用关联列表来避免在Prelude之外使用更多功能,但与VectorMap不同,它至少在标准中。):

import Data.Char
import Data.Array
import Data.List
-- Again leaving out the letterDatabase for brevity, see question.
letterArray = listArray ('A','Z') letterDatabase
draw :: String -> String
draw = unlines . map concat . transpose
     . map (letterArray !)
     . filter (inRange $ bounds letterArray)
     . map toUpper
main = putStrLn $ draw "GAB"

最新更新