OverloadedStrings
Rozszerzenie jest bardzo przydatne, ale ma pewne wady. Rozważmy następującą definicję funkcji:Używanie Przeciążonych Ciągów
someFunction :: ToJSSTring a => a -> IO()
someFunction = js_function . toJSSTring
W tym przypadku, gdy jeśli chcę przekazać wartość literalną muszę dodać podpis typu jawnie gdy OverloadedStrings
jest włączona:
someFunction ("This is plain string" :: String)
someFunction ("And this one is Text" :: Data.Text.Text)
Powodem tego Konieczność jest dość oczywista. Przypuszczam, że zaprojektowano OverloadedStrings
, aby ułatwić przekazywanie wartości literalnych do funkcji, które mają ścisłe podpisy typów, dzięki czemu programista może napisać wszędzie tam, gdzie potrzebna jest wartość .
Pytanie brzmi, czy na przykład domyślnie wszystkie ciągi literowe bez podpisów typu na Text
lub String
? Czy powinienem po prostu podzielić mój kod na funkcje ogólne (z ograniczeniem typu ToJSString
) i arbitralne, które mają ścisłe podpisy typów dla swoich argumentów?
Nigdy nie przestajesz mnie zadziwiać! Wielkie dzięki. –