我正在尝试定义一个函数,我希望它的行为略有不同,具体取决于作为参数,字符串和整数传入的数据类型。人们将如何去做呢?或者,您是否建议进行任何更改以某种方式将这两者组合为一个功能。我已经读过,尝试验证数据类型不是很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
作为第一个参数传递;如果是字符串,则在列表中找到它;如果是整数,则立即使用索引进行操作。具有相同的功能似乎更优雅。
答案 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