Próbuję zdefiniować dowolną prostą funkcję, która obejmuje wiele linii w ghci, weźmy jako przykład:
let abs n | n >= 0 = n
| otherwise = -n
Do tej pory próbowałem nacisnąć Enter po pierwszej linii:
Prelude> let abs n | n >= 0 = n
Prelude> | otherwise = -n
<interactive>:1:0: parse error on input `|'
Próbowałem również użyć poleceń :{
i :}
, ale nie zajdę daleko:
Prelude> :{
unknown command ':{'
use :? for help.
Używam GHC Interactive w wersji 6.6 dla Haskell 98 w systemie Linux. Czego mi brakuje?
:{
,:}
.Odpowiedzi:
W przypadku strażników (takich jak twój przykład) możesz po prostu umieścić je wszystkie w jednej linii i działa (strażnicy nie dbają o odstępy)
Jeśli chcesz napisać swoją funkcję z wieloma definicjami, które pasują do wzorca w argumentach, na przykład:
Następnie użyjesz nawiasów klamrowych ze średnikami oddzielającymi definicje
źródło
GHCi ma teraz tryb wejścia wieloliniowego, włączany za pomocą: set + m. Na przykład,
źródło
ghci
pod tym względem zachowuje się podobnie jak interpreter Pythona. Bardzo wygodne! W rzeczywistości możesz utworzyć.ghci
plik w swoim katalogu domowym, w którym umieścisz,:set +m
a tryb wielowierszowy stanie się domyślny za każdym razem, gdy zacznieszghci
!:set prompt "λ "
linii ciągłych, powiedzPrelude
zamiastλ
. Jakoś to obejść?let
. Po prostu wpisz a,let
po którym następuje nowa linia:let
⏎. Następniefac 0 = 1
⏎. Następniefac n = n * fac (n-1)
⏎ ⏎ i gotowe!Dan ma rację, ale
:{
i:}
każdy musi pojawić się w osobnym wierszu:To również współdziała z regułą układu, więc podczas korzystania z notacji do wykonania może być łatwiej jawnie użyć nawiasów klamrowych i średników. Na przykład ta definicja zawodzi:
Ale działa po dodaniu nawiasów klamrowych i średników:
Będzie to miało znaczenie tylko w przypadku wklejania definicji z pliku, gdzie wcięcie może się zmienić.
źródło
Wygląda
:{
i:}
jest całkiem nową funkcją. Może być konieczne uaktualnienie GHC.Edycja: potwierdzona, patrz http://www.haskell.org/ghc/docs/6.8.2/html/users_guide/release-6-8-2.html
źródło
Jeśli nie chcesz aktualizować GHC tylko dla
:{
i:}
, musisz zapisać wszystko w jednym wierszu:Nie znam żadnej definicji w Haskell, która musi być zapisana w wielu wierszach. Powyższe rzeczywiście działa w GHCi:
W przypadku innych wyrażeń, takich jak
do
bloki, musisz użyć składni innej niż układ z nawiasami klamrowymi i średnikami (eugh).źródło
Używam GHCi w wersji 8.2.1 na macOS Catalina 10.15.2. Poniżej opisano, w jaki sposób zestawiłem razem deklarację typu funkcji i osłony. Zwróć uwagę, że pionowe paski po lewej stronie dotyczą wielu linii GHCi.
źródło
:{
i:}
nie musisz określaćlet
przed deklaracją typu, co oznacza, że nie musisz wciskać drugiego i kolejnych wierszy.Wygląda na to, że wklejenie obu wierszy na raz lub użycie Ctrl-Enter dla każdego nowego wiersza utrzymuje wszystko razem, przynajmniej na https://repl.it/languages/haskell . Na początku drugiej linii zobaczysz 2 kropki. Lub umieść go w pliku i: załaduj plik (: l main). Dlaczego abs nie działa z liczbami ujemnymi? Och, musisz umieścić liczbę w nawiasach.
źródło