覆盖不同数据类型的功能

时间:2019-04-23 16:36:12

标签: haskell override

我正在尝试定义一个函数,我希望它的行为略有不同,具体取决于作为参数,字符串和整数传入的数据类型。人们将如何去做呢?或者,您是否建议进行任何更改以某种方式将这两者组合为一个功能。我已经读过,尝试验证数据类型不是很haskell,所以我认为重写可能是执行此操作的方法,但编译器不喜欢重复的:(

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,可以将StringInt作为第一个参数传递;如果是字符串,则在列表中找到它;如果是整数,则立即使用索引进行操作。具有相同的功能似乎更优雅。

1 个答案:

答案 0 :(得分:4)

这正是类型类背后的想法:您不是单独定义函数(或一组函数),而是将其定义为属于一个类的类,该类被一个(或多个)类型变量标记。然后,您定义类型类的一个或多个实例,并用不同的类型替换该类型变量,并在每个实例中为函数定义单独的主体。最终结果是该函数具有不同的主体,具体取决于其参数或结果的类型。

在您的示例中:

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