2010-11-18 16 views
5

Czytałem LYAH. Mówi, muszę jawnie załadować Control.Monad.Instances aby uzyskać następujące składnia do pracy:Dlaczego nie jest (->) zaimplementowane domyślnie w Control.Monad.Instances

((fmap (+5)) (+5)) 4 

Dlaczego tak jest? Dlaczego, jeśli funktory są tą podstawową i jednoczącą technologią, muszę jawnie załadować Control.Monad.Instances, aby uzyskać tę funkcjonalność. W jaki sposób jest (->) zaimplementowane bez niego (lub jest po prostu ukryte i wyeksportowane tylko ->)? Dlaczego nie stosuje się domyślnie typów funkcji zaimplementowanych?

+0

Zobacz także http://stackoverflow.com/questions/4204086/is-the-monad-w-instance-anywhere-standard –

Odpowiedz

10

W tym przypadku występują 3 różne koncepcje. Typ funkcji, klasa typu Functor i "instancja Functor". Typ funkcji (->) jest wbudowany w język, a jego istnienie i implementacja są całkowicie niezwiązane z Functor i fmap. Klasa typów to specyfikacja sygnatury powiązanych z nią metod. "Instancja" jest implementacją tego podpisu.

Tak, aby twoje pytanie było bardziej zrozumiałe, chciałbym powtórzyć to jako "dlaczego nie jest to instancja Funktora dla (->) zawarta w Preludium?" (Preludium jest modułem domyślnie w zasięgu). Jak to jest obecnie sformułowane, nie ma to większego sensu.

Odpowiedź na zmodyfikowane pytanie jest prosta: raport Haskell (oficjalna specyfikacja językowa, w której określono interfejs Prelude) nie zawiera go. Prawdopodobnie tak, ale język i biblioteki Haskell bardzo się rozwinęły, a standardy Haskella zmieniają się powoli. W każdym razie, tak czy nie, właśnie dlatego.

2

Funktor nie jest funkcją językową, jest to po prostu użyteczna czcionka typowa, którą definiuje losowy moduł. Aby użyć definicji modułu Functor tego modułu, musisz go załadować, koniec historii.

Powiązane problemy