Переопределяющие функции для разных типов данных - PullRequest
1 голос
/ 23 апреля 2019

Я пытаюсь определить функцию, поведение которой я хочу вести немного по-разному, в зависимости от того, какой тип данных передается в качестве аргумента, строк и целых чисел. Как можно это сделать? Или есть какие-то изменения, которые вы могли бы предложить как-то объединить эти два в одну функцию. Я читал, что попытка проверить тип данных не очень похожа на хаскель, поэтому я подумал, что переопределение может быть способом сделать это, но компилятору не нравится дубликат :(

jumpTo :: Int -> [String] -> [String]
jumpTo index t = do 
    let (x,y) = splitAt index t
    init x ++ [last x ++ "QQ"] ++ y

jumpTo :: String -> [String] -> [String]
jumpTo string t = do 
    pos <- [fromJust (findWord string t)]
    let (x,y) = splitAt pos a
    init x ++ [last x ++ "QQ"] ++ y

Словом, я хочу функцию jumpTo, которой можно передать либо String, либо Int в качестве первого аргумента; если это строка, я нахожу ее в списке, и для целого числа я делаю операции с индексом сразу. Просто кажется более элегантным иметь ту же функцию, выполняющую это.

1 Ответ

4 голосов
/ 23 апреля 2019

Это именно та идея, лежащая в основе классов типов: вы определяете свою функцию (или группу функций) не сами по себе, а как принадлежность к классу типов, который помечен переменной типа (или несколькими). Затем вы определяете один или несколько экземпляров класса типов с различными типами, заменяемыми для этой переменной типа, и вы определяете отдельные тела для функции в каждом экземпляре. Конечный эффект заключается в том, что функция имеет различное тело в зависимости от типов ее аргументов или результата.

В вашем примере:

class JumpTo a where
    jumpTo :: a -> [String] -> [String]

instance JumpTo Int where
    jumpTo index t = do 
        let (x,y) = splitAt index t
        init x ++ [last x ++ "QQ"] ++ y

instance JumpTo String where
    jumpTo string t = do 
        pos <- [fromJust (findWord string t)]
        let (x,y) = splitAt pos a
        init x ++ [last x ++ "QQ"] ++ y
...