2010-12-20 12 views
5

Czy istnieje sposób na zastosowanie funkcji do krotek członków jako argumentów funkcji? A jeśli nie, czy mogę w jakiś sposób utworzyć funkcję z dowolną liczbą argumentów iw jej ciele zastosować jakąś inną funkcję do "ogona", jak byłoby to jego argumentem?Rozkładaj krotkę w OCaml

Odpowiedz

7

W ogólnym przypadku nie. W przypadku 2 argumentów można użyć funkcji curry i uncurry w Batteries extensions to Pervasives.

To może można ugotować coś z modułem Obj, podobnie jak wewnętrzne z printf zrobić, ale chciałbym pozostać daleko daleko od tego. Trudność polega na tym, że system typów nie daje sposobu na wyrażenie rodzaju uogólnionej funkcji curry lub uncurry. System typów nie pozwala ci "obliczyć" długości krotki - 2-krotna to 2-krotna i nie masz możliwości wyrażenia, że ​​(a*b*c) jest naprawdę (a*b) z dodatkowym komponentem. printf ma specjalne wsparcie kompilatora, aby typy działały poprawnie, a to powoduje, że typ funkcji jest częścią typu formatu (więc podobne rozwiązania nie będą działały dla krotek).

7

Sam język nie pozwala na zdefiniowanie funkcji krotek o dowolnym rozmiarze.

Możliwe jest jednak zdefiniowanie funkcji z dowolną liczbą argumentów, postępując zgodnie z this folding technique (jest to opisane tam dla SML, ale działa równie dobrze w OCaml).