文档章节

工作需要写了第一个简单的haskell程序,练手

Kyli
 Kyli
发布于 2016/08/15 15:59
字数 333
阅读 41
收藏 0
点赞 0
评论 0
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}

module Main where

import Options.Applicative
import System.Environment
import System.Exit
import System.IO
import System.Directory
import System.FilePath
import Control.Exception
import qualified Data.Map.Lazy as DM
-- import qualified Date.ByteString.Lazy as BL
import Control.Monad (mapM_)


data MyArgs = MyArgs
  { dir :: FilePath
  , ref :: FilePath }

margs :: Parser MyArgs
margs = MyArgs
  <$> strOption
  (
    long "directory"
    <> short 'd'
    <> metavar "DIR"
    <> help "Directory that contains the downloaded files"
  )
  <*> strOption
  (
    long "reference"
    <> short 'r'
    <> metavar "REF"
    <> help "Reference file that contains the original names and new names"
  )

renameDownloads :: MyArgs -> IO ()
renameDownloads MyArgs {..} = do
  putStrLn $ "Rename maps: " ++ ref
  putStrLn $ "Source directory: " ++ dir
  r         <- getRenameRef ref
  fnames    <- getDirectoryContents dir
  let rnMap = DM.fromList r
  rename dir rnMap fnames
  putStrLn "Finished"

rename :: FilePath -> DM.Map FilePath String -> [FilePath] -> IO ()
rename dir renameMap = mapM_ rename'
  where rename' filename = case DM.lookup filename renameMap of
                             Nothing -> return ()
                             Just val -> renameFile (dir </> filename) (dir </> val)

getRenameRef :: FilePath -> IO [(FilePath, String)]
getRenameRef fpath = do
  h <- openFile fpath ReadMode
  hSetEncoding h utf8
  contents <- hGetContents h
  parse contents
  where
    parse = return . alist . parse'
    parse' = map words . lines
    alist = convert2alist . filterValidPath
    filterValidPath = filter (\inp -> case inp of
                                     (x:xs) -> True
                                     _ -> False
                                 )
    convert2alist = map (\(x:xs) -> (x, unwords xs))

main :: IO ()
main = execParser opts >>= renameDownloads
  where opts = info (helper <*> margs)
               (
                 fullDesc
                 <> progDesc "Batch rename the audio files downloaded from xxxxxxx"
               )

批量重命名,直接贴代码吧,写ruby的码农朋友说“这他么看也看不懂,是猴子写的吗?”

不得不说,Option.Applicative真心不错,貌似社区也是大力推荐,

没有用monad之类的,基本上就是很简单的逻辑,只是为了习惯了一下haskell的写法,连错误处理没有ADT也没有,所以,just a toy,只是为了满足需求

 

© 著作权归作者所有

共有 人打赏支持
Kyli
粉丝 4
博文 25
码字总数 4526
作品 0
高级程序员
函数式思维和函数式编程

作为一个对Hashell语言[1]彻头彻尾的新手,当第一次看到一个用这种语言编写的快速排序算法的优雅例子时,我立即对这种语言发生了浓厚的兴趣。下面就是这个例子: quicksort :: Ord a => [a] ...

oschina ⋅ 2014/09/05 ⋅ 24

golang winForm开发

最近一直在看rust,语法挺头疼的,正好趁着1.0发布前的一段时间,回来玩玩golang。 golang的语法很简单,liteIde又变得越来越好用,因此学习golang不会花费您多少时间,还能够清醒被rust晃晕...

你来人间一趟 ⋅ 2015/02/13 ⋅ 20

Flask练手项目之通讯录

断断续续学习Flask已经有一两个月了,看了很多Flask相关的东西,但是感觉光看不练效果不佳,所以在工作之余写了一个简单的通讯录系统,主要用的还是Flask+bootstrap写的。代码写的也不太好,...

Jeff_Linux ⋅ 2014/07/21 ⋅ 0

Haskell 语言为什么值得你去学习

当我向一些新手推荐学习Haskell语言时,得到的反应通常是:“为什么要学Haskell?”,“这是一种实用的语言吗?”或者“这是一种我可以真正用的语言吗?”我的回答是明确的YES。 Haskell并不...

oschina ⋅ 2013/03/12 ⋅ 22

我的见解---Kmeans和PCA

非监督学习: 非监督学习和监督学习的最大区别是不需要先验知识,无需人为干涉。 Kmeans -----笔者按照自己的理解写了kmeans也许不对,全当写轮子练手。 Kmeans计算的步骤: 1、 在数据集中随...

qq_15642411 ⋅ 02/09 ⋅ 0

Haskell 趣学指南第九章:Input and Output

输入和输出 未完,待续(博客里的Markdown有点不如人意,请见谅) 前面已提到过Haskell是纯函数语言。在命令式语言中你可以指定一系列步骤让计算机去执行,然后得到结果,而函数语言则更偏向于...

leekelby ⋅ 2014/01/15 ⋅ 0

Haskell 2014.2 发布,函数式编程语言

函数式编程语言 Haskell 2014.2 发布了,改进记录请看 changelog (表示没看懂) Haskell是一种纯函数式编程语言,它的命名源自美国数学家Haskell BrooksCurry,他在数学逻辑方面上的工作使得...

oschina ⋅ 2014/08/11 ⋅ 13

函数式编程语言--Haskell

Haskell是一种纯函数式编程语言,它的命名源自美国数学家Haskell Brooks Curry,他在数学逻辑方面上的工作使得函数式编程语言有了广泛的基础。Haskell语言是1990年在编程语言Miranda的基础上...

匿名 ⋅ 2009/12/15 ⋅ 2

(转) Twisted :第二十一部分 惰性不是迟缓: Twisted和Haskell

简介 在上一个部分我们对比了Twisted与 Erlang,并将注意力集中在它们共有的一些思想上.结果表明使用Erlang也是非常简便的,因为异步I/O和反应式编程是Erlang运行时和进程模型的关键元素. 今天...

水果糖 ⋅ 2016/01/27 ⋅ 0

Hont/ImageCombiner

Image Combiner 简介 烘培场景贴图时每次都需要打开PS再合并,也可以在烘培直接设置合并,但有些效果必须要手调叠加模式和alpha。 于是写了这个工具 支持通配符,Normal和Specular这类的格式...

Hont ⋅ 2016/01/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

金山WPS发布了Linux WPS Office

导读 近日,金山WPS发布了Linux WPS Office中文社区版新版本,支持大部分主流Linux系统,功能更加完善,兼容性、稳定性大幅度提升。本次更新WPS将首次在Linux提供专业办公文件云存储服务,实...

问题终结者 ⋅ 昨天 ⋅ 0

springboot2输出metrics到influxdb

序 本文主要研究一下如何将springboot2的metrics输出到influxdb maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

go4it ⋅ 昨天 ⋅ 0

微信小程序 - 选择图片显示操作菜单

之前我分享过选择图片这个文章,但是我在实际开发测试使用中发现一个问题在使用 wx.chooseImage 选择照片显示出第一格是拍照,后面是相册里的图片。这种实现之前说过了,效果如下。 但是你从...

hello_hp ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部