Я знаю, что String определяется как [Char], но я хотел бы сделать разницу между ними из экземпляра класса. Возможно ли это с помощью какого-то умного трюка, кроме использования newtype для создания отдельного типа? Я хотел бы сделать что-то вроде:Различают строки и [Char]
class Something a where
doSomething :: a -> a
instance Something String where
doSomething = id
instance (Something a) => Something [a] where
doSomething = doSoemthingElse
И получить разные результаты, когда я называю его doSomething ("a" :: [Char])
и doSomething ("a" :: String)
.
Я знаю о FlexibleInstances
и OverlappingInstances
, но они, очевидно, не вырезают корпус.
Вы не можете сделать это, на листе компилятора, '[Char]' и 'String' - это то же самое. Типичные имена синонимов исчезают. Если вы должны явно аннотировать в любом случае, почему бы не использовать новый тип. – jozefg
Если вам интересно иметь другое поведение для 'Something => [a]' и для 'String', используя haskell98, вы можете сделать то, что делает класс Show, и использовать трюк [extra method] (http: // brandon.si/code/how-the-haskell-prelude-avoids-overlapping-types-in-show/) – jberryman
Проблема в том, что, насколько я понимаю, он всегда будет вызывать экземпляр 'String', потому что' type String = [ Char] ', поэтому он не решает моего дела. – qwe2