moduleSolutions.Functions2importData.List%defaulttotal---------------------------------------------------------------------------------- Let Bindings and Where Blocks---------------------------------------------------------------------------------- 1recordArtistwhereconstructorMkArtistname:StringrecordAlbumwhereconstructorMkAlbumname:Stringartist:ArtistrecordEmailwhereconstructorMkEmailvalue:StringrecordPasswordwhereconstructorMkPasswordvalue:StringrecordUserwhereconstructorMkUsername:Stringemail:Emailpassword:Passwordalbums:ListAlbumEqArtistwhere(==)=(==)`on`nameEqEmailwhere(==)=(==)`on`valueEqPasswordwhere(==)=(==)`on`valueEqAlbumwhere(==)=(==)`on`\a=>(a.name,a.artist)recordCredentialswhereconstructorMkCredentialsemail:Emailpassword:PasswordrecordRequestwhereconstructorMkRequestcredentials:Credentialsalbum:AlbumdataResponse:TypewhereUnknownUser:Email->ResponseInvalidPassword:ResponseAccessDenied:Email->Album->ResponseSuccess:Album->ResponseDB:TypeDB=ListUserhandleRequest:DB->Request->ResponsehandleRequestxs(MkRequest(MkCredentialsepw)album)=casefind((e==).email)xsofNothing=>UnknownUsereJust(MkUser__pw'albums)=>ifpw'/=pwthenInvalidPasswordelseifelemalbumalbumsthenSuccessalbumelseAccessDeniedealbum--2namespaceEx2dataFailure:TypewhereUnknownUser:Email->FailureInvalidPassword:FailureAccessDenied:Email->Album->FailurehandleRequest:DB->Request->EitherFailureAlbumhandleRequestdbreq=casefind((==)req.credentials.email.email)dbofNothing=>Left(UnknownUserreq.credentials.email)Justu2=>case(u2.email==req.credentials.email&&u2.password==req.credentials.password)ofFalse=>LeftInvalidPasswordTrue=>caseelemreq.albumu2.albumsofFalse=>Left(AccessDeniedreq.credentials.emailreq.album)True=>Rightreq.album-- 3dataNucleobase=Adenine|Cytosine|Guanine|ThyminereadBase:Char->MaybeNucleobasereadBase'A'=JustAdeninereadBase'C'=JustCytosinereadBase'G'=JustGuaninereadBase'T'=JustThyminereadBasec=Nothing-- 4traverseList:(a->Maybeb)->Lista->Maybe(Listb)traverseList_[]=Just[]traverseListf(x::xs)=casefxofJusty=>casetraverseListfxsofJustys=>Just(y::ys)Nothing=>NothingNothing=>Nothing-- 5DNA:TypeDNA=ListNucleobasereadDNA:String->MaybeDNAreadDNA=traverseListreadBase.unpack-- 6complement:DNA->DNAcomplement=mapcompwherecomp:Nucleobase->NucleobasecompAdenine=ThyminecompCytosine=GuaninecompGuanine=CytosinecompThymine=Adenine