Thread View: pl.comp.lang.funkcyjne
7 messages
7 total messages
Started by Wojciech Mula
Fri, 19 Aug 2005 22:11
Dostęp do dowolnego elementu krotki w OCamlu
Author: Wojciech Mula
Date: Fri, 19 Aug 2005 22:11
Date: Fri, 19 Aug 2005 22:11
18 lines
1430 bytes
1430 bytes
W ML-u jest bardzo wygodny operator #i (a,b,...,n), w OCamlu nie ma, albo ja nie mogę znaleźć. Więc jeśli nie ma, to czy istnieje jakaś funkcja, która dostarczałaby identyczną funkcjonalność? Oczywiście mógłbym pisać dla każdego przypadku odrębną funkcję, np.: let trzeci_w_piątce (_,_,x,_,_) = x;; ale jakoś mi się to nie widzi. Może jednak za bardzo przyzwyczaiłem się do ML-a i powinienem raczej porzucić złe nawyki?... ;) TIA Wojtek -- JID: wmula@chrome.pl | pomóż znaleźć lek na raka http://www.mula.w.pl | http://www.find-a-drug.org
Re: Dostęp do dowolnego elementu krotki w OCamlu
Author: Marcin 'Qrczak' Kowalczyk
Date: Fri, 19 Aug 2005 22:43
Date: Fri, 19 Aug 2005 22:43
14 lines
1668 bytes
1668 bytes
Wojciech Mula <wojciech_mula@poczta.null.onet.pl.invalid> writes:
> W ML-u jest bardzo wygodny operator #i (a,b,...,n), w OCamlu nie ma,
> albo ja nie mogę znaleźć.
Nie ma. Zazwyczaj najwygodniej jest napisać wzorzec krotkowy w miejscu
gdzie ta wartość byłaby nazywana jakąś zmienną:
let x, y = wyrażenie in
...
--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
Re: Dostęp do dowolnego elementu krotki w OCamlu
Author: Marcin 'Qrczak' Kowalczyk
Date: Fri, 19 Aug 2005 22:44
Date: Fri, 19 Aug 2005 22:44
15 lines
1818 bytes
1818 bytes
Wojciech Mula <wojciech_mula@poczta.null.onet.pl.invalid> writes:
> W ML-u jest bardzo wygodny operator #i (a,b,...,n), w OCamlu nie ma,
> albo ja nie mogę znaleźć.
Nie ma. Zazwyczaj najwygodniej jest napisać wzorzec krotkowy w miejscu
gdzie ta wartość byłaby nazywana jakąś zmienną, np. (x, y) zamiast
parametru funkcji albo
let x, y = wyrażenie in
...
--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
Re: Dostęp do dowolnego elementu krotki w OCamlu
Author: Wojciech Mula
Date: Sat, 20 Aug 2005 00:04
Date: Sat, 20 Aug 2005 00:04
35 lines
2434 bytes
2434 bytes
Marcin 'Qrczak' Kowalczyk wrote: > Wojciech Mula <wojciech_mula@poczta.null.onet.pl.invalid> writes: > >> W ML-u jest bardzo wygodny operator #i (a,b,...,n), w OCamlu nie ma, >> albo ja nie mogę znaleźć. > > Nie ma. Zazwyczaj najwygodniej jest napisać wzorzec krotkowy w miejscu > gdzie ta wartość byłaby nazywana jakąś zmienną, np. (x, y) zamiast > parametru funkcji albo > let x, y = wyrażenie in > ... Dzięki za odpowiedź, te sposoby znałem jeszcze z ML-a. Myślałem, że są jakieś inne, magiczne. :) Przy okazji mam jeszcze kilka pytań: 1. Naprawdę nie ma funkcji valOf? Przegrepowałem całą dokumentację i nic. 2. Jak w OCamlu jest z efektywnością obsługi wyjątków? Przede wszystkim chodzi mi o to, czy mógłbym rzucać wyjątkami zamiast męczyć się z obsługą typu option. 3. Czy trzeba pisać np. let x=0 in let y=x+5 in..., tzn. "zakończyć" let'a, żeby utworzony w jego obrębie symbol (x) był widoczny dalej? 4. Zetknąłem się teraz z dziwacznością. Dokumentacja twierdzi, że float jest funkcją typu int -> float i w interaktywnym interpreterze działa jak należy. Natomiast gdy w mojej funkcji napisałem coś takiego v = float y, to pojawił się błąd, iż y jest typu int, a został użyty w wyrażeniu float. Gdy w miejscu float użyłem funkcji float_of_int (o dokładnie tym samym typie!) problem znikł. w. -- JID: wmula@chrome.pl | pomóż znaleźć lek na raka http://www.mula.w.pl | http://www.find-a-drug.org
Re: Dostęp do dowolnego elementu krotki w OCamlu
Author: Marcin 'Qrczak' Kowalczyk
Date: Sat, 20 Aug 2005 05:45
Date: Sat, 20 Aug 2005 05:45
43 lines
3096 bytes
3096 bytes
Wojciech Mula <wojciech_mula@poczta.null.onet.pl.invalid> writes:
> 1. Naprawdę nie ma funkcji valOf? Przegrepowałem całą dokumentację i nic.
Nie wiem, możliwe że nie ma.
> 2. Jak w OCamlu jest z efektywnością obsługi wyjątków? Przede wszystkim
> chodzi mi o to, czy mógłbym rzucać wyjątkami zamiast męczyć się
> z obsługą typu option.
Są efektywne. Koszt propagacji wyjątku zależy od liczby bloków try
między rzuceniem a złapaniem, a nie od liczby ramek stosu.
Zawsze można zmierzyć, żeby się upewnić.
> 3. Czy trzeba pisać np. let x=0 in let y=x+5 in..., tzn.
> "zakończyć" let'a, żeby utworzony w jego obrębie symbol (x) był
> widoczny dalej?
Jeśli ma być widoczny na toplevelu, to zamiast takiego leta trzeba
napisać toplevelowego leta, tzn. "let x = 0 let y = x + 5", bez "in".
To odpowiada val i fun w SML.
W interaktywnym interpreterze trzeba dodać ";;", żeby parser wiedział,
że to już koniec.
Kiedy następną definicją jest wyrażenie obliczane dla skutków
ubocznych, to też trzeba dodać ";;" przed nim. Albo napisać to
wyrażenie tak: "let () = ..." tudzież "let _ = ...".
> 4. Zetknąłem się teraz z dziwacznością. Dokumentacja twierdzi, że float
> jest funkcją typu int -> float i w interaktywnym interpreterze działa
> jak należy. Natomiast gdy w mojej funkcji napisałem coś takiego
> v = float y, to pojawił się błąd, iż y jest typu int, a został
> użyty w wyrażeniu float. Gdy w miejscu float użyłem funkcji
> float_of_int (o dokładnie tym samym typie!) problem znikł.
Może przesłoniłeś wcześniej definicję float jakąś własną.
--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
Re: Dostęp do dowolnego elementu krotki w OCamlu
Author: Wojciech Mula
Date: Sat, 20 Aug 2005 10:28
Date: Sat, 20 Aug 2005 10:28
30 lines
2052 bytes
2052 bytes
Marcin 'Qrczak' Kowalczyk wrote: > Jeśli ma być widoczny na toplevelu, to zamiast takiego leta trzeba > napisać toplevelowego leta, tzn. "let x = 0 let y = x + 5", bez "in". > To odpowiada val i fun w SML. > > W interaktywnym interpreterze trzeba dodać ";;", żeby parser wiedział, > że to już koniec. > > Kiedy następną definicją jest wyrażenie obliczane dla skutków > ubocznych, to też trzeba dodać ";;" przed nim. Albo napisać to > wyrażenie tak: "let () = ..." tudzież "let _ = ...". Ok, dzięki. Ale w funkcji to już nie działa, błąd składniowy ze wskazaniem na drugie let: let foo x = let a=100 let b=a+10 in x+a+b;; Myślałem też, że "and" zadziała jak w SML-u, ale gdy wpisałem "and" zamiast drugiego leta, został zgłoszony błąd "unbound value a". > Może przesłoniłeś wcześniej definicję float jakąś własną. Tak było, nieopatrznie otworzyłem moduł Random, który właśnie ma funkcję float. w. -- JID: wmula@chrome.pl | pomóż znaleźć lek na raka http://www.mula.w.pl | http://www.find-a-drug.org
Re: Dostęp do dowolnego elementu krotki w OCamlu
Author: Marcin 'Qrczak' Kowalczyk
Date: Sat, 20 Aug 2005 14:13
Date: Sat, 20 Aug 2005 14:13
21 lines
2138 bytes
2138 bytes
Wojciech Mula <wojciech_mula@poczta.null.onet.pl.invalid> writes:
> Ok, dzięki. Ale w funkcji to już nie działa, błąd składniowy ze
> wskazaniem na drugie let:
>
> let foo x = let a=100 let b=a+10 in x+a+b;;
No bo to była składnia deklaracji, a nie wyrażenia.
W funkcji: let foo x = let a=100 in let b=a+10 in x+a+b;;
> Myślałem też, że "and" zadziała jak w SML-u, ale gdy wpisałem "and"
> zamiast drugiego leta, został zgłoszony błąd "unbound value a".
and bez let rec jest mało praktyczny, bo wtedy wszystkie prawe strony
są wyliczane w środowisku bez wprowadzanych właśnie zmiennych.
and ma sens przy let rec, przy typach itp.
--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads