我试图定义一个函数,我希望行为略有不同,具体取决于作为参数,字符串和整数传入的数据类型。怎么会这样做呢?或者你有什么变化可以建议以某种方式将这两个组合成一个函数。我读过,试图验证数据类型不是很像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
,它可以传递一个String
或Int
作为它的第一个参数;如果它是一个字符串,我在列表中找到它,对于一个整数,我直接用索引进行操作。拥有相同的功能似乎更优雅。
这正是类型类背后的想法:您不是单独定义函数(或一组函数),而是属于类型类,它使用类型变量(或多个)标记。然后定义一个或多个类型类的实例,用不同的类型替换该类型变量,并在每个实例中为函数定义单独的实体。最终效果是函数具有不同的主体,具体取决于其参数或结果的类型。
在你的例子中:
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