覆盖不同数据类型的函数

问题描述 投票:1回答:1

我试图定义一个函数,我希望行为略有不同,具体取决于作为参数,字符串和整数传入的数据类型。怎么会这样做呢?或者你有什么变化可以建议以某种方式将这两个组合成一个函数。我读过,试图验证数据类型不是很像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作为它的第一个参数;如果它是一个字符串,我在列表中找到它,对于一个整数,我直接用索引进行操作。拥有相同的功能似乎更优雅。

haskell override
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.