🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#704
Author: Wojciech Mula
Date: Fri, 19 Aug 2005 22:11
18 lines
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
#705
Author: Marcin 'Qrczak' Kowalczyk
Date: Fri, 19 Aug 2005 22:43
14 lines
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
#706
Author: Marcin 'Qrczak' Kowalczyk
Date: Fri, 19 Aug 2005 22:44
15 lines
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
#707
Author: Wojciech Mula
Date: Sat, 20 Aug 2005 00:04
35 lines
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
#708
Author: Marcin 'Qrczak' Kowalczyk
Date: Sat, 20 Aug 2005 05:45
43 lines
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
#709
Author: Wojciech Mula
Date: Sat, 20 Aug 2005 10:28
30 lines
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
#710
Author: Marcin 'Qrczak' Kowalczyk
Date: Sat, 20 Aug 2005 14:13
21 lines
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