Haskell 重写不同数据类型的函数

Haskell 重写不同数据类型的函数,haskell,overriding,Haskell,Overriding,我试图定义一个函数,我想根据作为参数、字符串和整数传入的数据类型,该函数的行为略有不同。一个人怎么做呢?或者,您是否可以建议进行任何更改,以某种方式将这两个函数组合成一个函数。我读到尝试验证数据类型不像haskell那样,所以我认为重写可能是实现这一点的方法,但编译器不喜欢重复的:( jumpTo::Int->[String]->[String] 跳转到索引t=do 设(x,y)=在索引t处拆分 初始x++[最后一个x++“QQ”]++y 跳转到::字符串->[String]->[String]

我试图定义一个函数,我想根据作为参数、字符串和整数传入的数据类型,该函数的行为略有不同。一个人怎么做呢?或者,您是否可以建议进行任何更改,以某种方式将这两个函数组合成一个函数。我读到尝试验证数据类型不像haskell那样,所以我认为重写可能是实现这一点的方法,但编译器不喜欢重复的:(

jumpTo::Int->[String]->[String]
跳转到索引t=do
设(x,y)=在索引t处拆分
初始x++[最后一个x++“QQ”]++y
跳转到::字符串->[String]->[String]
跳到字符串t=do

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

在您的示例中:

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
类跳转到何处
跳转到::a->[String]->[String]
实例跳到Int,其中
跳转到索引t=do
设(x,y)=在索引t处拆分
初始x++[最后一个x++“QQ”]++y
实例跳转到字符串,其中
跳到字符串t=do

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

在您的示例中:

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
类跳转到何处
跳转到::a->[String]->[String]
实例跳到Int,其中
跳转到索引t=do
设(x,y)=在索引t处拆分
初始x++[最后一个x++“QQ”]++y
实例跳转到字符串,其中
跳到字符串t=do

这就是TypeClass背后的思想:它用于“特殊多态性”.就我对本文的理解而言,typeclass允许您在同一函数中使用不同的数据类型,但实际上并没有覆盖函数定义本身?您可以将typeclass中的
jumpTo
类jumpTo a
定义为
jumpTo::a->[String]->[String]
,然后声明两个实例:
实例跳转到Int
,和
实例跳转到String
。对于每个
实例
,可以提供不同的实现。事实上,这就是
显示
的工作方式。例如:每个类型都定义其特定的
显示
方式。这就是TypeClass背后的思想:it用于“特殊多态性”。就我对本文的理解而言,typeclass允许您在同一函数中使用不同的数据类型,但实际上并没有覆盖函数定义本身?您可以在typeclass
类jumpTo a
中将您的
jumpTo定义为
jumpTo::a->[String]->[String]
,然后声明两个实例:
实例JumpTo Int
,和
实例JumpTo String
。对于每个
实例
,您可以提供不同的实现。事实上,这就是
显示
的工作方式。例如:每种类型都定义了其特定的
显示
方式。谢谢,这现在就有意义了ile我正在获取字符串实例的非法实例声明,将其重写为[]字符也没有帮助。我尝试“承诺”haskell我不会定义任何重叠实例,但是通过使用函数,我收到了错误,说这太模糊了[那么如何使用字符串?@peterxz您需要打开
typesynonymentInstances
FlexibleInstances
。完成此操作后,您编写的代码仍然无法编译,但这是一个不相关的问题。谢谢,这很有意义!编译时,我得到了字符串instance的非法实例声明ce,将其重写为[]Char也没有帮助。我曾尝试“承诺”haskell,我不会定义任何重叠实例,但是通过使用函数,我收到错误,说它太模糊了[那么如何使用字符串?@peterxz您需要打开
TypeSynonymInstances
FlexibleInstances
。完成此操作后,您编写的代码仍然无法编译,但这是一个不相关的问题。