2013-03-31 17 views
9

w szkole sprawowaniuWzorzec dopasowania w GHCi

mam tę funkcję

bar :: Float -> Float -> Float 
bar x 0 = 0 
bar 0 y = 0 
bar x y = x * y 

wpisuję go w GHC jak

let bar x 0 = 0; bar 0 y = 0; bar x y = x * y 

i oceny

bar foo 0 
bar 0 foo 

jestem poproszony o zmodyfikowanie paska do użycia '|' więc chcę zrobić coś takiego:

let bar x y = | x 0 = 0 | 0 y = 0 | x y = x * y 

ale w ghci mam

parse error on input '=' 

Jak mogę to zrobić w GHCi? Czy fakt używania dopasowywania wzorców ("|") coś zmieni?

+1

Twój oryginalny "słupek" używa dopasowywania wzorców.Chcesz się dowiedzieć o [strażnikach] (http://en.wikibooks.org/wiki/Haskell/Truth_values#Guards). – dave4420

+2

Możesz być szczególnie sprytny i napisać po prostu 'let bar | inaczej = (*) '... – leftaroundabout

+3

Usuń' = 'przed pierwszą ochroną,' niech bar x y | x == 0 = ... | y == 0 = ... | inaczej = ... '. –

Odpowiedz

16

Spójrz na składni z wykorzystaniem osłon:

bar x y | x == 0  = 0 
     | y == 0  = 0 
     | otherwise = x * y 

Wpisany na jednej linii w GHCi:

let bar x y | x == 0 = 0 | y == 0 = 0 | otherwise = x * y 
9

używać plików

Nie wpisać swój kod bezpośrednio do ghci chyba że jest to naprawdę jeden liniowiec.

Zapisz swój kod w pliku tekstowym o nazwie PatternMatch.hs i załaduj go w ghci, wpisując.

:l PatternMatch.hs 

a następnie, jeśli zostaną wprowadzone zmiany (i zapisać) można przeładować plik w ghci wpisując

:r 

Alternatywnie, można wymienić swoje pliki po których korzystają one są, lub po prostu ponownie włączyć Temp.hs, jeśli naprawdę jest to kod jednorazowy.

Zapisywanie elementów w pliku tekstowym znacznie ułatwia edycję i wielokrotnego użytku.

Moduły

Później będziesz zbierać funkcji związanych ze sobą za pomocą odpowiedniego modułu, dzięki czemu mogą one być importer w innych programach. Na przykład można mieć

module UsefulStuff where 

pamf = flip fmap 

zapisany w pliku o nazwie UsefulStuff.hs a następnie w innym pliku można

import UsefulStuff 

a następnie użyj funkcji z UsefulStuff tam.

Moduły są przesadzone z tego, co robisz teraz, ale otrzymanie przepływu pracy edycji, zapisywania, rekompilacji, testowania, powtarzania, zaoszczędzisz sobie trochę wysiłku.

+0

Witamy w 21 wieku. Pliki należą do szafki z mosiężnym uchwytem. W dzisiejszych czasach, kiedy fajne dzieci układają swój kod w JSFiddle i rzucają się na przycisk Run lub chwalą się w piaskownicy Swift dla natychmiastowej satysfakcji, ta odpowiedź nie wygra z wieloma potencjalnymi programistami Haskell. Naprawdę fajne dzieciaki prawdopodobnie udają się do [Shen] (http://www.shenlanguage.org/), gdzie mogą mieć wszystkie funkcjonalne programy i sprawdzać dobroć, której pragną, a następnie niektóre. I tak, ma REPL, który pozwala na wielowierszowe wejście "od razu po wyjęciu z pudełka", wpisz podpisy i wszystko. – ack

+1

@ack Myślę, że pomylisz mnie z osobą, która dba o to, co robią fajne dzieci, podczas gdy ja naprawdę dbam jedynie o to, aby pomóc ludziom w jak najlepszym wykorzystaniu narzędzi, z których korzystam. Dzięki za spam o fikcji. – AndrewC

+0

Jeśli ci na tym zależy, być może mógłbyś odnieść się do [tej odpowiedzi] (http://stackoverflow.com/a/8443096/588561), która nie wymaga użycia plików. – ack