背景
上周五(20年8月28日)的时候,公司测试同学需要测试我的一个提测需求,其中有个测试用例是需要检查下下后台导出的兑换口令列表文件中是否有重复的口令。
由于导出的口令有数百万之多,肯定是不能用眼去看了,原本是打算用excel来检查的,但是我一想:ei(二声)~,最近不是正好在搞Haskell
吗?正好拿来练练手,用Haskell
写个检测程序。
Why is Haskell
因为这个程序写出来是要交给测试同学使用的,如果用java
或者php
这种解释型语言来写,还需要测试同学先去安装个java
/php
的解释器才行,显然是有点扯的,所以用编译型语言写完后直接build出一个可执行文件才比较方便。
当然可以将java/php的程序打包成一个可执行文件,但是又要花费我一些不必要的时间了。
编译型语言中我常用的有golang和Haskell。不可否认Go面对这个需求写起来可能更快,但是我其实还是想用Haskell练练手。
那? 开始吧!
首先,使用cabal
创建一个项目
代码语言:javascript复制$ mkdir repeat && cd repeat
$ cabal init
导出的口令文件是以rn
换行的,haskell的lines函数无法切分,所以需要通过cabal引入一个包:split
,我的repeat.cabal文件就变成了下面这样了:
cabal-version: >=1.10
-- Initial package description 'repeat.cabal' generated by 'cabal init'.
-- For further documentation, see http://haskell.org/cabal/users-guide/
name: repeat
version: 0.1.0.0
-- synopsis:
-- description:
-- bug-reports:
-- license:
license-file: LICENSE
author: wangdongdong
maintainer: wangdongdong@smzdm.com
-- copyright:
-- category:
build-type: Simple
extra-source-files: CHANGELOG.md
executable repeat
main-is: Main.hs
-- other-modules:
-- other-extensions:
build-depends: base >=4.13 && <4.14, split
-- hs-source-dirs:
default-language: Haskell2010
编辑Main.hs
代码语言:javascript复制module Main where
import Data.List.Split
import Data.List
import System.IO
import System.Environment
main = do
args <- getArgs
check args
-- 通过模式匹配获取命令行参数中的文件名
check::[String] -> IO ()
check [filename] = do
contents <- readFile filename
-- 暴力通过去重后的list length对比来判重,不可取
if (length $ mylines contents) /= (length $ nub $ mylines contents)
then putStrLn "有重复元素"
else putStrLn "没有重复元素"
check x = putStrLn "请输入文件名"
-- 通过split库的splitOn函数以rn为切割符将文件内容切分为list
mylines contents = splitOn "rn" contents
最后编译为可执行文件
代码语言:javascript复制$ cabal build
编译结果在dist-newstype文件夹之中
交付使用
代码语言:javascript复制$ ./repeat keywords.txt
能够满足需求!
后续优化请看
《我的第一个面向需求的Haskell程序》续