- 论坛徽章:
- 7
|
我一直想学好Haskell,但是一直没有真正去用Haskell去完成什么实质性的任务,所以我就把你这个需求当成我自己的练习题了,希望以后尽量多用Haskell去解决实际问题。不过,你想要的代码是Perl的,我的代码可能对你没什么用。另一方面,希望有Haskell方面的专家能给我的代码提改进意见。好,下面是代码- $ cat amino.txt
- A 0.09497947 0.070426046 0.078231678 0.069402819 0.073001587 0.067751808 0.065225551
- C 0.003987824 0.004239198 0.006126589 0.00579803 0.006359058 0.007059202 0.007186454
- D 0.031654608 0.028931216 0.021204204 0.029173854 0.025034137 0.021646325 0.024539473
- E 0.030191737 0.025704815 0.0171375 0.023008412 0.019931428 0.017206993 0.018367772
- F 0.021186211 0.018803895 0.024108434 0.023349227 0.026832478 0.025921508 0.027780867
- G 0.047137968 0.028274228 0.02906955 0.027688427 0.030174135 0.027163123 0.026097522
- H 0.061280362 0.053520624 0.047650885 0.057602322 0.048347118 0.046961954 0.052401045
- I 0.030525902 0.030684054 0.029671778 0.029735665 0.030828516 0.033772121 0.029383376
- K 0.030053403 0.021923645 0.020619838 0.025112887 0.020833923 0.023215196 0.022188839
- L 0.090544049 0.103690465 0.112389986 0.101604113 0.111333642 0.111322299 0.115992927
- M 0.034562358 0.030696831 0.029966439 0.026875373 0.027945538 0.03101157 0.02620991
- N 0.04517639 0.040286853 0.031861131 0.040137567 0.033102225 0.035602927 0.032904046
- P 0.001273168 0.171672655 0.169522808 0.154487958 0.159433689 0.155568683 0.161045977
- Q 0.064491638 0.052384357 0.043509473 0.051301545 0.043542068 0.040985172 0.047284907
- R 0.03516902 0.033794677 0.046343819 0.04827906 0.055693288 0.058490476 0.059932226
- S 0.136940411 0.097910949 0.106347363 0.10304508 0.104407819 0.105721405 0.103542222
- T 0.133603708 0.103408973 0.098715659 0.093232499 0.088656527 0.099685822 0.083992158
- V 0.05101914 0.041507999 0.040548266 0.040028439 0.043047795 0.039284095 0.041277095
- W 0.022307746 0.013552552 0.018361253 0.015865506 0.019287738 0.018945619 0.018187325
- Y 0.033914888 0.028585968 0.028613348 0.034271218 0.032207292 0.032683703 0.03646031
- $ cat gen_amino.hs
- module Main where
- import System.Environment (getArgs)
- import System.Random (getStdGen, randoms)
- parseAminoAcidDistribution :: String -> [(String, [Double])]
- parseAminoAcidDistribution s = scanl1 f $ map fromRow rows
- where f (_, v) (k', v') = (k', zipWith (+) v v')
- fromRow row = (head row, map read (tail row))
- rows = map words $ lines s
- genHeptapeptide :: [(String, [Double])] -> [Double] -> String
- genHeptapeptide t ds = concatMap f [0..6]
- where f i = fst . head $ dropWhile (g i) t
- g i (_, v) | (ds !! i) >= (v !! i) = True
- | otherwise = False
- genHeptapeptides :: [(String, [Double])] -> [Double] -> [String]
- genHeptapeptides t ds = genHeptapeptide t (take 7 ds) : genHeptapeptides t (drop 7 ds)
- main = do
- args <- getArgs
- contents <- readFile "amino.txt"
- stdGen <- getStdGen
- let aminoAcidDist = parseAminoAcidDistribution contents
- randomNumbers = randoms stdGen
- n = read $ head args
- outFile = args !! 1
- writeFile outFile $ unlines $ take n $ genHeptapeptides aminoAcidDist randomNumbers
- $ ghc gen_amino
- [1 of 1] Compiling Main ( gen_amino.hs, gen_amino.o )
- Linking gen_amino ...
- $ ./gen_amino 20 seq.txt
- $ cat seq.txt
- VATKDTV
- ETDHDPP
- TGPCSLS
- SYLPDTH
- TLKLSCN
- HSSRPPP
- KLLTSVL
- YATKTPN
- VPPLMFS
- GPDMSGV
- SPHLNWL
- GKSPHVE
- APHQKHS
- QPADTLT
- MAPTHVG
- TSPNLSS
- DVPVSLP
- HPKALAL
- THNLVPG
- VGSLPSL
复制代码 从上面可以看到我写的代码是从命令行指定输出文件和输出序列的条数,我显示了输出20条7肽的一次(因为结果是随机的,所以这个限定词很重要)运行结果。 |
|