2.编程med ord och strängar阿内·兰塔Datorintroduktion 2009,D och DV,Chalmers&GU%!目标:html%!postproc(html):#NEW%!postproc(html):#HR
#新款==瓦德马提克==西弗罗?塔尔?Funktitoner?几何造型师?所有som man kan göra**exakta resonemang**om:-定义精确-ge slutgiltiga贝维斯-梅卡尼斯卡牛排Om man vill skriva dator program Om nágot,krävs precis detta:-matematisk建模-形式化(iett programsprák)Detär基因组材料建模vi kan skriva程序som handlarinte bara om tal、utaäven ord、texter、bankkonton、mobila nätverk、,安斯泰尔达·埃特·弗雷塔格。。。#新款==处理av ord och strängar==维基加tillämpnigar av datorer-订单处理(Microsoft Word)-典型值-文本统计信息-sökmotorer(谷歌)-马斯金·沃塞宁Idag ska vi lära grunderna直到**sträng处理**i Haskell。Nästa gáng ska vi至ampa kunskapen至större texter。#新款==战略==En sträng(``String``)i Haskellär En lista av**tecken**(``Char``):i前奏曲定义类型```type String=[Char]```Ett tecken anges i enkelfnuttar公司:```“a”```En sträng kan sáledes anges med de kända符号erna för listor:```[‘k’,‘o’,‘r’,‘k’]```男性专用符号:```“kork”(韩国)```#新款==Funktitoner med strängar公司==Mycket av kraften ligger i att alla listoperationer fungerr med strängar:```['a'..'z'][x|x<-“kork”,x/=“k”]['a','a'…]长度“kork”拿两个“kork”```Vi ska sitta ner och beräkna dessa公司。男子vissa listoperationerär speciellt användbara med strängar:t.ex。**konkatenation**,``++``:```“kork”++“skruv”==“korkskruv“```#新款==实验med strängfunktitoner==Konkatenera tvánsträngar med ett mellanslag emellan公司。```“hello”++“”++“world”```Ta bort alla mellanslag frán en sträng ``s``。```unspace::String->字符串取消空间s=[c|c<-s,c/='']```Räkna hur många gånger bokstaven//k//förecommer i en sträng“s”。```number_k::字符串->整数number_k s=长度[c|c<-s,c==‘k’]```#新的==梅拉实验med strängfunktitoner==Eliminera fyrbokstavsord公司([“四个字母的单词”http://en.wikipedia.org/wiki/Four-letter_word])frán en ordlista“ws”。```unfour::[String]->[String]unfur ws=[w | w<-ws,长度w/=4]```Ta ut initialerna av en lista直到en sträng。```首字母缩写::[String]->[String]缩写ws=[取1 w|w<-ws]```#新的==字符串==En sträng kan delas upp i ord vid avgränsande mellanslag och nyradstecken公司。Detta görs med前奏曲-funktitionen``歌词``:```单词“直到och med”==[“直到”,“och”,“med”]```Lát oss ta initialerna frán varje ord i en stráng(来自瓦杰恩街):```首字母缩写s=[take 1 w|w<-words s]```När vi har hanterat färdigt varje ord,kan vi skriva tillbaka den我的生活很艰难nya strängen med“unwords”:```unwords(缩写(单词“until och med”)==“t o m”```Obs.``unwords``skapar inget mellanslage efter det sista ordet总统。弗罗斯滕:är det alltid sáatt```unwords(单词s)==s```Ge bevis eller汽车旅馆!#新款==订单-订单-订单==Idé:ersätt varje ord i en text med ett nágot annat ord艾德:艾德·瓦杰·罗德在发短信时得到了安纳特·罗德-斯文斯卡ord med norska ord(maskinöversättning)-fula ord med anständiga ord(审查)-Apple-ord med Microsoft-ord(texttvättning)Det finns ett generellt mönster i程序:```翻译::字符串->字符串translate s=unwords[replace w | w<-words s]```där``replace::String->String``。#新款==莫氏匹配==Vi-kan definiera en ersättningsfunktion med**fallanalysis**,med hjälp av**mönstermatching**:```替换::字符串->字符串替换“inte”=“ikke”替换“jag”=“jeg”替换w=w```Funktionen beräknas基因组匹配av mönstren i samma ordning。德特弗尔斯塔穆斯坦·索姆·马查尔直到阿帕斯。莫恩斯特·坎瓦拉-康斯坦塔·瓦尔登(konstanta värden),桑马·瓦尔德(samma várdet)的somendast matcar det:``“杰格”``-变量,som matchar vad som helst:``w``Nu fángas alltsáalla ord som inte behöverändras med variabeln ``w``,och sammaord returneras som värde。```translate“jag kommer inte-med”==“jeg kommer-ikke med”```#新款==Ommaskinöversättning==Ord-för-Ord metodenär inte sájättebra:se t.ex.den svenska versionen av公司[den här sidan先生网址:http://www.cs.chalmers.se/~rjmh/]。#新款==倒车==Funktionen som returnerar en lista i omvänd订单:```反面::[a]->[a]```Exempel公司:```反向[1,2,3]==[3,2,1]反转“en-korkskruv”==“vurkskrok ne”```Exempel:测试回文,dvs.samma baklänges(t.ex.“转子”)。```回文::String->Bool回文s=反面s==s```#新款==梅拉回文==Det finns en samling i t.ex公司。[维基百科http://sv.wikipedia.org/wiki/Palindrom];//我重新审视现状//观察者:mellanslag ignoreras i palindromestet:```回文::String->Bool回文s=unspace(反面s)==unspace s```(德特·哈尔·昆德·戈拉斯(Det här kunde göras effektivare förstás)#新的==格式化问题集==Pöförsta föreläsningen skapade vi tabeller,t.ex.kvadrattabellen公司```[(x,x*x)|x<-[0..10]]```Tyvärr blev utseendet lite trákigt:```[(0,0),(1,1),(2,4),(3,9),(4,16),(5,25),(6,36),(7,49),(8,64),(9,81),(10,100)]```我是一个很好的朋友,我是一个很好的朋友梅尔兰斯拉格。赫尔六世?#新款==Frán tal至strängar==Lót oss börja med hur man skriver//ett//par avtal med ett mellanslag emellan(路易斯·博尔贾·梅德赫曼·斯科里弗)。```前奏曲>3++“”++5:1:0:(Num[Char])没有实例源自文本“3”:1:0...```Nágon排序**typfel**。Poängenär att``“”``bara kan konkateneras医学en sträng,inte med ett heltal。Vi máste**konvertera**heltal至strängar。Konvertering till strängar公司哥尔斯(för de flesta typer)med funktitionen“秀”。Alltsá:```显示12==“12”--Int显示3.14==“3.14”--浮点显示[1,2,3]==“[1,2,4]”--[Int]show“hello”==“\”hello\“”--字符串``` #新款==格式化av tabeller==Nu vet vi att vi ska skriva sáhár:```前奏曲>演出3++“”++演出5"3 5"```奥特斯特·r att hantera listan av alla rader:```[显示x++“”++显示(x*x)|x<-[0..10]]```尼拉德斯特肯医学院Vi vill skriva ut listan som en sträng梅兰·瓦杰元素。类比med``words``och``unwords`'har前奏曲-``lines``,som delar upp en sträng till en lista av strángar,维德·瓦杰·奈拉德斯特肯(``\n``)-``unlines``,som tar en lista av strängar och returnerar en stráng där varje元素ur listan slutar med ett nyradstecken#新款==Skriva utt en sträng==斯科里瓦·厄特·恩·斯特朗==Det hár ser intealls胸罩:```前奏曲>取消连接[show x++“”++show(x*x)|x<-[0..10]]“0 0 \n1 1 \n2 4 \n4 16 \n5 25 \n6 49 \n8 64 \n8 81 \n10 100 \n”```问题:GHCi visar**stränguttrycket**,i ett format som skulle kunnaanvändas i en Haskell-fil公司。第六骷髅队(Det vi skulle vilja i ställetär att strängen)。Utskriftenär在音乐节上发挥了作用。Men i Haskell kan man programmera utskrift av en sträng med前奏曲-funktionen``putStr``:#新款==Utskrift av kvadrattabellen公司==```前奏曲>putStr(unlines[show x++“”++show(x*x)|x<-[0..10]])0 01 12 43 94 165 256 367 498 649 8110 100```Obs:``print x```är samma som``putStr(show x++“\n”)``。Násta gáng:来自输出och and ra**IO调节器**(输入-输出)。#新款==Vad fár man skriva och var==I en//Haskell-fil//:**定义器**,som bestór av```FUNKTIONSNAMN变量=UTTRYCK```Detta betyder att funktionsnamet fár användas i samma fillernär filen laddas i GHCieller importeras i en annan fil公司。直到//GHCi-prompten//:uttryck,dvs.högerled av definitioner。```模块>UTTRYCK```Detta betyder att GHCi ska beräkna värdet av uttrycket och签证详情。Man kan//inte//skriva ett ensamt uttryck i en fil.(曼坎)。//Inte heller//kan man skriva en定义直到提示。#新款==GHCi定义器==在GHCi的skriva定义者处进行检测。Man måste använda nyckelordet“让”:```序曲>让fac n=产品[1..n]前奏曲>fac 6720```Alltsá:直到提示skriver man**kommandon**:-ett bart uttryckär kommandot att beräkna dess värde-ett``让``让`让科曼多特在米尔乔恩·德阿的定义中加入läggasenare kommandon ges公司对象:瓦尔杰·尤特里克·索姆贝拉克纳(varje uttryck som beräknas)的定义是:de följande raderna har samma效果:```前奏曲>2+2前奏曲>让它=2+2```#新的==提升机=====重做===Uppgifterna ska redovasis i en fil``Ex2.hs``,som erhálls基因组atter ersätta alla` `未定义` ` i följande:```模块Main,其中main=做打印ex2打印ex3putStr ex4ex2=长度“i en bra film finns alltid droider”长度::字符串->[Int]长度s=未定义ex3=缩写“Very Superior Old Pale”缩写::String->String缩写s=未定义示例4::字符串ex4=未定义```**对象**:om du kopierar koden,se till att den första raden(med ordet``模块``)och瓦杰·拉德·索姆·博尔贾尔(varje rad som börjar frán samma position flyttas till bör jan)av raden公司。#新款==向上==1.Kör minst有限元示例ur denna föreläsning,med minst en egen变量av varje。2.Skriv en funktion公司```长度::[String]->Int```som läser en sträng och returnerar listan av公司längderna pávarje ord。Uttrycket``ex3``定义为som tillämpning av denna funktion till“我在胸罩电影《芬妮斯·艾尔蒂德·德罗德》”。3.Skriv en funktion公司```缩写::String->String```som tal initialerna av alla ord i en sträng姓名首字母缩写och skriver dem tillbaka i en sträng med en punkt och ett mellanslag:```缩写“till och med”==“t.o.m.”```Uttrycket``ex3``定义为som tillämpning av denna funktion till“非常上乘的老苍白”。4.Skriv om Fahrenheit-tabellen frönövning 1.2 páett sádant sätt att公司瓦杰·塔尔帕·科默·佩恩·埃根·拉德(varje talpar kommer páen-egen rad),医学院电视台梅兰斯拉格·梅兰·塔伦(mellanslag mellan talen)。特克斯。```120.0 48.888888888888886```Svaret ges i uttyck``ex4``。5.Skriv en ord-till-ordöversättare med egen ``替换``-功能。Behöver国际重新签证。#新款==Sammanfattning och参考=====GHCi定义器===提示前,Man kan skriva en定义:```序曲>让fac n=产品[1..n]```评估av ett uttryck t.ex。``2+2``tolkan som en definition av``it``:```前奏曲>让它=2+2```===莫氏匹配===En funktion kan definieras med En sekvens av definitioner,德国瓦杰定义汉特拉·埃特(hanterar ett)落到了梅德·埃特·莫恩斯特(ett mönster)手里。特克斯。```替换::Char->Char替换“v”=“w”替换c=c```En variabel somöster hanterar allt som inte hanterats av tidgare公司莫恩斯特。===Tecken och strängar公司===```type String=[Char]“kork”==['k','o','r','k']```===前奏曲===```--康卡捷纳列表器(++)::[a]->[a]->[a]--塔夫兰·奥尔登/拉德纳单词::String->[String]行::String->[String]--använd strängarna som ord/rader i en stráng公司unwords::[String]->字符串unlines::[String]->字符串--returnera motsatsen公司不::Bool->Bool--李斯坦·巴克兰反面::[a]->[a]--konvertera värde至strängshow::(show a)=>字符串--skriv ut en sträng公司putStr::字符串->IO()```