4.编程med hjälp av bibliotek

阿内·兰塔
Datorintroduktion 2009,D och DV,Chalmers&GU

埃特·斯特雷上推

升级:utifrán en text,skapa en弗雷克文斯利斯塔,som愤怒hur mánga gánger varje ord förekommer i文本:

och 3247号公元1892年汉1694英语1671公元1633年i 1604年索姆1526公元1275年公元992年jag 990型

Programmet ska kunna köras som ett unix-filter,som i föregóende föreläsningen公司:

cat redRoom.txt | runghc频率

变矩器av uppdraget

1.Sortera listan alfabetiskt i stället för i frekvensordning公司。

2.Returnera antalet unika ord i texten公司。

3.Ange relativa frekvenser。

4.Ignorera插入:医学och公司医学。斯卡瓦拉·桑马·罗德。

5.Ignorera skillnaden mellan stora och smábokstaver公司:医学och公司医学矽卡岩瓦拉·桑马·罗德。

6.Ignorera HTML标签。

Vad har vi redan?

Uppdragetär inte琐事:om-man skriver项目frán början krävs kanske埃勒·梅尔,艾娃·科德。

Dessutom:detär lätt att公司哥拉菲尔,eller att programmet blir程序欧菲克提夫特(lángsamt och/eller minneskrävande)。

我的生活enkelt程序:翻译-funktitonen blir公司intemerän tre rader kod!

最佳电视节目:

  1. underöka vilka funktitoner som finns一号标准书目
  2. dela-upp算法,直到delar som finns i书目

美国石油学会

I Haskell,ett bibliotekär en module med funktitoner(och typer)。

Varje funktion har,som vanligt,en typsignatur och en定义。

Exempel:sortering i图书馆列表:

排序::序号a=>[a]->[a]排序xs=。。。

定义av分类ser lite risig ut,och viär glada att公司第六届贝尔瓦斯克里瓦登斯亚尔瓦国际博览会。我免费享用frán biblioteket!

美国石油学会

美国石油学会=应用程序程序员界面。Dettaär vad书目安万达vill se av图书馆。

我Haskell ges APIt I form av,för varje funktion,en typsignatur och诉讼期间贝斯克里夫宁(som kommentar)av vad funktitonen gör:

--按升序对列表排序排序::序号a=>[a]->[a]

Dettaär det enda vi behöver否决权分类.

列出APIför en全面实施;六比约弗·巴拉·恩利滕·利滕·德尔·伊达格(behöver bara en liten liten del idag)。

Vad gör类型?

Vi ska först estracera i GHCi,och därför laddar Vi图书目录:

前奏曲>:l列表列表>排序[3,1,2][1,2,3]

Vad kan vi sotera?类型kräver att类型av元素i listan阿里·克拉斯订单; 德塔·贝蒂德(detta betyder att detär möjligt att jämföra)och sätta dem i en storleksordning元素。

Detfulla APIt av Haskell-bibliotek säger vilka typer somär i Ord;努诺杰六世oss med att testrira lite、för att se直到att vi fár det vi behöver。

Vad kan sorteras?

Vi kan naturligtvis sortera heltal,flyttal,tecken och strängar公司:

列表>排序[1.0,0.999][0.999,1.0]列表>排序“abracadabra”“aaaaa bbcdrr”列表>排序(单词“kan inte detta sorteras i haskell”)[“detta”,“haskell”,“i”,“inte”,“kan”,“sorteras”]

分拣av en fil

你的名字是什么?只是det:vi skriver ett文本过滤器:

--文件频率模块Main,其中导入列表主::IO()main=交互翻译翻译::字符串->字符串translate=排序

Vad händer om vi sorterar en fil med detta?

$cat ett.txt | runghc频率

分拣av orden i en fil

刚确定:vi fár alla tecken i ordning。Först mellanslagen轿车插入,轿车stora bokstäver och,直到sist smá,i alfabetisk ordning:

!,,,,,,,--。。。。。;;;;AADDDDEFGIJKLMPRSSTTTaaaaaaaaaAAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBBC中文网-两岸ddddddd每个人每个人eeeeeeeeee ffffffffFFffffffff ggggg。。。

Låt oss sortera公司i stället för tecken:

translates=unwords(排序(单词s))

Nu fár vi ett resultat som ser ut sáhär:

-De Den Det Där FRSTA Grásparvarne Josefinadagen KAPITLET公司Mosebacke Rosendal Stockholm afton allmänheten allting arbetate莫斯科att att att-av-av av barège-lappar bersáer bjödo blivit blom,布鲁姆。博芬卡恩,博尔特比加·邦克福德德德德德!德朱尔·德拉加·德罗戈斯·德拉法·德拉里内·埃夫特·恩恩等等等等。。。

Gruppering av element i en列表

När vi sorterar en lista:inget element försvinner,inte ens duplikat。

男子alla förekomster av samma element ligger brevid varandra。

Vi kan utnyttja detta för att公司格鲁佩拉元素。

I List-APIt hittar六:

--获取一个列表并返回一个列表列表,以便--结果的结果等于参数。此外,每个子列表--结果中只包含相等的元素组:等式a=>[a]->[[a]]

Exempel公司:

列表>“密西西比”组[“m”,“i”,“ss”,“i”,“ss”,“我”,“pp”,“y”]列表>组(排序为“密西西比”)[“iii”、“m”、“pp”、“ssss”]

Frán gruppering直到frekvenser

Hur kan vi använda gruppering för att räkna ut frekvenserna?

乔:vi tar längden av alla listor i grupperingen

列表>[(头x,长度x)|x<-组(排序为“密西西比”)][(‘i’,4),('m',1),(‘p’,2),(’s',4)]

Vi har valt ut ett elementet frán varje lista,det första,医学博士前奏曲放克琴

头部::[a]->a

Nu har vi frekvensen av varje tecken i“密西西比”。

男人们都在寻找食物。

分拣av frekvenstabellen

Vi-kan dock sortera en lista av parocksá;där sorterar man i första先生有了efter det första elementet,我andra就有了efert det andra。

(Jfr.telefonkatalogen:ordningen följer)我是弗尔斯塔·汉德·埃弗纳姆,我是安德拉·汉德·弗纳姆。)

列表>排序[(head x,length x)|x<-group(sort“misssippi”)][(‘i’,4),('m',1),(‘p’,2),(’s',4)]

Vi fár alfabetisk分拣人员正在进行Frekvensorring。(Dessutom:vi hade den ju redan frón det första(圣母院)分类!)

Frán gruppering直到frekvenssortering

De räcker att vända om paret(ELEMENT,FREKVENS)och sortera轿车:

列表>排序[(长度x,头x)|x<-group(排序“密西西比”)][(1,'m'),(2,'p')

嗯,detta blir frán det minst to det mest frekventa,enligt“升序”som APIt lovade公司。

Det enklaste vi kan göra nuär(om-viäri GHCi)

列表>反转[(4,'s'),(4,‘i’),(2,‘p’),[(1,'m')]

Och nu har vi precis vad vi ville ha,förutom formatering!

Frekvensorrering av orden i en fil公司

斯科里瓦·恩尼警署翻译-funktion somör frekvensorring:

转换s=show(反转(排序([(长度x,头部x)|x<-group(排序(单词s))]))

Vi provkör detta公司:

unix$cat ett.txt | runghc频率[(8,“och”),(7,“p\229”),...

节目介绍了格鲁特萨克,弗鲁托姆格式化。男人们发现了塞尔·甘斯卡·里西格特。。。

Gruppfrekvens som en hjälpfuknation公司

Titta pádet här igen:

翻译s=show(反转(排序([(长度x,头部x)|x<-group(排序(单词s))]))

弗鲁托姆Detär en ganska snygg嵌套医学图书馆列表管理。

Vi tar ut frekvensberäkningen till en egen hjälpfunktion公司:

频率::[[a]]->[(Int,a)]频率xs=[(长度x,头部x)|x<-xs]

等等,瞧:

translates=显示(反向(排序(频率(组(排序(单词))))

塞乌特·索姆Lisp语言(“大量令人恼火的多余括号”,eller“LISt处理”)。

Haskell,i själva verket,är ungefär som Lisp医学打字员。

Funktitoner och管道

Vi har lyckats stycka upp程序,直到7 funktitoner,varav 6 kommerfrán standard bibliotek(墨彩前奏曲):

translates=显示(反向(排序(频率(组(排序(单词))))

Dettaär mycket likt en公司i Unix:sju程序i sekvens,där输出在som输入中frán det ena skickas直到det násta。

Om det fanns ett Unix程序för alla bitar(och visst skulle man kunna)skriva dem),骷髅人kunna skapa frekvenstabellen med

unix$cat“ett.txt”|单词|排序|组|频率|排序|反转|显示

Alltsásamma funktitoner i baklänges订单。

Ochánnu viktigare:i en s.k。朋克弗里高跷:

Funktionskom位置

戈达·尼赫特(Goda nyheter):管道kanäven skrivas i Haskell!

男士:deskrivs omvänd ordning jämfört med Unix:

translate=显示。相反。排序。频率。组。排序。

Ordningenär den samma som i funktionsapplikationen。

Den matematiska modellenárfunktionskom位置:

Om公司f:A->Boch公司克:B->C,ság o f:A->C,där(g o f)(x)=g(f(x)).

Precis samma regel finns i Haskells前奏曲:

(.)::(b->c)->(a->b)->(a->c)(g.f)x=g(fx)

Och-funktionskompositiononen fár itereras sálänge typerna matcar。

(I Unixär allting av类型字符串.)

Utskrift av frekvenstabellen公司

När programmetär snyggt indelat i funktitoner som komponeras,堪萨斯州手动变阻器检测。

Vi börjar med att ersätta先生显示med en snyggare显示器:

显示::[(Int,String)]->字符串显示xs=unlines[snd x++“”++显示(fst x)|x<-xs]

Vi har här an vänt tványa Prelude-funktioner,som tar ut elementen i ett par:

fst::(a,b)->a序号::(a,b)->b

Och nu fár vi结果som ser snygga ut:

unix$cat ett.txt | runghc频率开放式课程8第7页i 6个索姆4电子技师4...

海拉·科登

模块Main,其中导入列表主::IO()main=交互翻译翻译::字符串->字符串translate=显示。相反。排序。频率。组。排序。频率::[[a]]->[(Int,a)]频率xs=[(长度x,头部x)|x<-xs]显示::[(Int,String)]->字符串显示xs=unlines[snd x++“”++显示(fst x)|x<-xs]

统计:

Algoritmen i sammanfatting公司

“en tusenlappär alltid en tusenlab”“en”、“tusenlapp”、“är”、“alltid”、“en”和“tusenlab”分类[“alltid”,“en”,“en”,“tusenlapp”,“tosenlapps”,“är”][[“alltid”],[“en”,“en”],[[“tusenlapp”,“tusenlab”],【“är”]]频率[(1,“alltid”),(2,“en”)分类[(1,“alltid”),(1,”är“),(2,”en“),[(2,“tusenlapp”)]颠倒[(2,“tusenlapp”),(2,”en“),(1,”är“),[(1,“alltid”)]显示“tusenlapp 2\nen 2\när 1\nalltid 1”

Komplexiteten av算法(överkurs)

单词O(n)排序O(n log n)组O(n)频率O(n)排序O(n log n)反向O(n)显示O(n)

斯卡帕·弗雷克文斯利斯坦·拉尔特·拉比泽尔(skapa frekvenslistanär alltsáratoell)n*对数ndär村n个är antalet ord i文件。

Dettaär inte sämreän公司den bästa möjliga算法(som dock拖鞋göra萨姆马恩加通道)。

医学文献库får vi ett项目somär marginelt sämreän det bästa möjliga,med en brákdel av arbete!

变体av frekvenstabellen

Vi ska slinka在funktioner i中翻译för att modifera funktitionaleten:

Och vi ska provköra项目med olika文件管理器。

塔博尔特语“hapax”ord

塔博尔特一次频词,dvs.ord som förekommer bara en gáng。

notHapax::[(Int,String)]->[(Int,String]notHapax xs=[x|x<-xs,fst x>1]

提升:placera detta i rättälle i koden。

变体:filtrera med ett annat talän 1。

Normalisera文本

归一化丝氨酸av文本处理:

Den första朋客kan göras med hjälp av

normalize::String->字符串规范化s=[toLower x | x<-s,isAlpha x | isSpace x]--删除HTML标记;koden finns i Translate.hs公司unHTML::String->String

Vi har använt följande funktitoner frán图书馆烧焦:

isAlpha::Char->Bool--是字母isSpace::Char->Bool--是空格、制表符或换行符toLower::Char->Char—将大写字符转换为小写

直方图

埃特直方图är en gravisk表示av numerisk数据。特克斯。

och公司**************************************************检测**********************************汉族*******************************自动变速箱***************************恩*************************我************************

Där använder vi följande formeln för att beräkna antalet stjärnor公司:

比例::[(Int,String)]->Int->Int比例xsi=div(50*i)(fst(头部xs))

Vi skriver ut raderna医学

直方图::[(Int,String)]->String直方图xs=unlines[snd x++“\t\t”++复制(比例xs(fst x))'*'| x<-xs]

选项卡(\t吨)används för att pelarna ska börja frán samma kolumn。

前奏曲-复调复制producerar en lista avönskat antal元素:

复制::Int->a->[a]

提升机

Alla uppgifter görs med hjälp av egna修改器频率hs.

1.Kör ordstatistik pánágra filer med svensk och engelsk文本,och andra斯德哥尔摩。Blir det samma top 10 i olika texter pásamma sprák?Ingen重新修饰。

2.Lägg till公司使正常化och公司unHTML帕拉特·斯泰伦一世订单统计。Redovisning公司:科尔统计局登·哈·föreläsningen.

3.Modifiera ordstatistiken(med normalsering)sáatt den skriver ut公司ett直方图(med stjärnor)av de 100 vanligaste orden。Redovisning公司:kör programmet医学罗达朗美.

4.Hur fár man ut frekvensen avett-visst命令? 哥尔德塔梅德在联赛中,正常人和国家统计局en-Unix-pipe直到格雷普.Redovisning公司:räkna ut antalet förekomster av ordet“ehuru”i罗达·鲁米特.

5Redovisning公司:Räkna ut antalet奥利卡语命令i罗达朗美med hjälp医院av den vanliga,normalserand statistiken och en Unix管道。

Sammanfattning och裁判

前奏曲-音乐剧

--返回列表中的第一个元素头部::[a]->a--组合函数(.)::(b->c)->(a->b)->(a->c)(g.f)x=g(fx)--返回一对中的第一个/第二个元素fst::(a,b)->a序号::(a,b)->b--通过重复元素构建列表复制::Int->a->[a]

Funktitoner frán列表

En kopia av公司列表.hs

--按升序对列表排序排序::序号a=>[a]->[a]--将列表中相邻的相等元素分组组:等式a=>[a]->[[a]]

Funktitoner frán字符

En kopia av公司字符hs

isAlpha::Char->Bool--是字母isSpace::Char->Bool--是空格、制表符或换行符toLower::Char->Char—将大写字符转换为小写