2013-02-08 16 views
32

Pytanie to rozpoczęła się zJeśli SML.NET ma funktory, dlaczego nie może F #?

  1. My tłumaczeniu "ML for the Working Programmer" (WorldCat) L. C. Paulson do F #, który wykorzystuje funktory w przykładach.
  2. Ostateczne pragnienie przetłumaczenia "Purely Functional Data Structures" przez Chrisa Okasaki, który używa funktorów.
  3. Czytanie "CATEGORIES TYPES AND STRUCTURES - An Introduction to Category Theory for the working computer scientist" (WorldCat) autorstwa Andrei Asperti i Giuseppe Longo.
  4. Niezrozumienie wszystkiego, głównie teorii kategorii.

SML.NET może tworzyć funktory i pracować z Microsoft .NET.
* Patrz: SML.NET User Guide Rozdział 4.8.2 Typy klas i funktory?

Wciąż widzę, że F # nie może wykonywać prawdziwych funktorów z powodu pewnych ograniczeń w Microsoft .NET.
* Can ML functors be fully encoded in .NET (C#/F#)?
* Any workaround for functor?

Więc jeśli SML.NET mógłby zrobić funktory na .NET to dlaczego nie można F #? Co zrobił SML.NET, że F # nie może?

Im więcej dowiaduję się o funktorach pochodzących z teorii kategorii, tym bardziej widzę ich piękno i pragnę je mieć w języku F #.

EDIT

W dążeniu do lepszego zrozumienia relacji między kategorii teorii i programowania funkcyjnego zobaczyć te Q&A w CS:StackExchange.

+0

Ponieważ ludzie mają to pytanie wpatrzone, dodaję link do tego papieru, ponieważ mogą znaleźć papieru zainteresowania. [Fizyka, topologia, logika i obliczenia: Kamień z Rosetty] (http://arxiv.org/pdf/0903.0340v3.pdf) –

+0

Zainteresowanie: [Generics of a Higher Kind] (http: //adriaanm.gitub. io/files/higher.pdf) i [Co to jest typ wyższego typu w Scali?] (http://stackoverflow.com/questions/6246719/what-is-a-higher-kinded-type-in-scala) i [Dodaj wyższe klasy generyczne do F # - (Typ klasy)] (https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2228766-add-higher-order-generics-to-f-type- classes-) –

+0

Zainteresowanie: [Globalne przeciążenie operatora w F #] (http://stackoverflow.com/questions/19682432/global-operator-overloading-in-f) i [FsControl - An F # biblioteka podstawowa ze standardową ad-hoc funkcje polimorficzne w stosunku do prymitywnych typów.] (https://github.com/gmpl/FsControl) –

Odpowiedz

39

Nie ma fundamentalne ograniczenie .NET, który zatrzymuje funktory od realizowanych w F #. To prawda, że ​​nie można ich reprezentować bezpośrednio w metadanych .NET, ale nie mogą też korzystać z innych funkcji języka F #, takich jak typy związków. Kompilatory języków z funktorami (np. Standard ML, OCaml) mają przepustkę o nazwie defunctorize; działa podobnie jak rozszerzenie szablonu C++, ponieważ "spłaszcza" funktory, wyspecjalizowując je w zwykłe moduły.

Kompilator F # może zrobić to samo, ale musisz zapytać: w jaki sposób będzie to narażone na inne języki .NET? Od funktory nie może być bezpośrednio kodowanego w systemie typu .NET, trzeba by wymyślić jakiś sposób, aby je reprezentują; i czy ta reprezentacja jest trudna/niemożliwa do użycia z C# czy VB.NET, czy nadal byłoby sensowne dołączanie funktorów F #? Nie nietrywialną częścią sukcesu F # jest możliwość łatwego współdziałania (w obu kierunkach) z C# i VB.NET.

EDYCJA: Nie zrozumcie mnie źle - chciałbym mieć funktory w języku F #, byliby naprawdę przydatni do obsługi kilku przypadków, które są obecnie bolesne i/lub niemożliwe do zrealizowania bez nich. Podkreślam tylko, że głównym powodem, dla którego język nie ma jeszcze (i być może nigdy nie będzie) funktorów jest to, że kwestia współdziałania nie została rozwiązana; problem z kodowaniem metadanych jest w rzeczywistości łatwy.

EDIT 2: Kod do defunctorize przejściu MLton: defunctorize.fun

Aktualizacja: miałem myśl o tym, jak funktory faktycznie mógłby być wyrażona w systemie typu .NET, więc ułożyła mały eksperyment. Nie jest ładna, ale działa - więc teraz wiemy, że przynajmniej możliwe jest, że F # może pewnego dnia wspierać funktory. W praktyce złożoność kodu eksperymentalnego będzie ukryta przez kompilator/język. Jeśli chcesz to sprawdzić: experimental-functors

+1

+1 - Prawdopodobnie trafisz paznokieć w głowę z interopem. Masz pomysł, jak funktory w SML.NET pojawiły się w innych językach .NET? – Daniel

+0

@Daniel Czy to pomaga? [Przygody w zakresie interoperacyjności: Doświadczenia SML.NET] (http://research.microsoft.com/pubs/67332/p53-benton.pdf) –

+0

@GuyCoder: Dzięki, ale nie widzę nic na temat reprezentacji funktorów w CIL tam. Na podstawie tego, co powiedział Jack, powinienem założyć, że funktor jest "defunctorized" na kilka standardowych modułów i pojawiają się w ten sposób w innych językach .NET? – Daniel