SML



  • Hi.

    Kennt sich hier jemand zufällig mit SML (Standard ML) aus?

    Wenn ja, könnte mir diese Person vielleicht erklären was ein Functor ist, bzw. wie er funktioniert und wofür man sowas verwendet?

    Hab gehört ist sowas ähnliches wie in C++ templates.....aber kann irgendweie keine Zusammenhänge erkennen 🙄



  • war da nicht kürzlich ein artikel im iX oder Linux Magazin?



  • Functor hört sich so an wie Functoren in C++ 🙄

    #include <iostream>
    
    template<typename Functor> void foo(Functor f) {
      f();
    }
    
    void bar() {
      std::cout << "hallo welt!\n";
    }
    
    int main() {
      foo(bar);
    }
    

    Also die möglichkeit Funktionen in Variablen zu speichern.



  • ne thx, habs jetzt glaub ich so einigermaßen verstanden.

    in sml sind variablen (wenn man das so sagen kann) sowieso schon funktionen die sich selbst als wert zurückliefern



  • Nee, umgekehrt, Funktionen sind schon Werte 🙂 In Haskell könnte man sagen, dass Variablen aufgrund der Lazy Evaluation Funktionen mit 0 Argumenen sind.

    kingruedis Beispiel würde BTW so aussehen:

    fun foo f = f () ;
    fun bar () = print "hello world" ;
    -- main "Funktion"
    foo bar ;
    

    Kein Funktor weit und breit 🙂 Funktoren sind in SML was anderes, eher angelehnt an den mathematischen Begriff aus der Kategorientheorie, soweit ich das verstehe. Was genau, kann ich dir leider nicht erklären.
    Warum Funktionsobjekte in C++ jetzt Funktoren heißen ... hmm 🙂



  • so wie ich das sehe sind funktoren, wie schon gesagt das gleiche wie templates in c++. ich schreib den funktor mit einer "allgemeinen" signatur in der kein datentyp definiert ist, und kann dann mit einer neuen signatur in der ich den datentyp definiere den funktor aufrufen und somit eine neue struktur mit dem angegeben datentyp erstellen.

    und funktionen liefern werte ja, die zahl 3 alleine wäre auch eine funktion die eben als wert 3 liefert.



  • Wenn es dir was bringt, das so zu sehen ... du kommst so doch mit unit -> 'a Funktionen durcheinander, die man üblicherweise als null-stellige Funktionen interpretiert.

    let a = fn () => 42
    and b = 42
    ...
      a () ist 42
      b ist 42
    

    In Haskell dagegen gibts diese Unterscheidung nicht, da würde ich kein Problem mit deiner Interpretation haben.


Anmelden zum Antworten