Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何创建数据子类型_Haskell - Fatal编程技术网

Haskell 如何创建数据子类型

Haskell 如何创建数据子类型,haskell,Haskell,我想将一个子数据类型传递到函数中 例如: data Car a = Ford | Opel | BMW | Mercedes a deriving (Show) data Mercedes a = SClass a| CClass a| MClass a myfunc::Car->String myfunc a = show a ++ " works correctly" 但我确实: myfunc类“x” 上面说 不在范围内:构造函数类 首先,您需要如下定义您的车型: data C

我想将一个子数据类型传递到函数中

例如:

data Car a = Ford | Opel | BMW | Mercedes a deriving (Show)

data Mercedes a = SClass a| CClass a| MClass a


myfunc::Car->String
myfunc a = show a ++ " works correctly"
但我确实:

myfunc类“x”

上面说

不在范围内:构造函数类


首先,您需要如下定义您的车型:

data Car a = ... | Mercedes (MercedesClass a) | ...

data MercedesClass a = CClass a | ...
。。。然后你可以写:

myFunc (Mercedes (CClass "x"))

首先,您需要如下定义您的车型:

data Car a = ... | Mercedes (MercedesClass a) | ...

data MercedesClass a = CClass a | ...
。。。然后你可以写:

myFunc (Mercedes (CClass "x"))
要实现“子”类型,有几个选项。第一种方法是在尝试时使用更多的
数据
类型:

data Car a = Ford (Ford a) | Mercedes (Mercedes a) deriving (Show)

data Ford a = ModelT a | Falcon a deriving (Show) -- different Fords models
data Mercedes a = CClass a | SClass a deriving (Show) -- different Mercedes models
注意,作为类型构造函数不同于作为数据构造函数,因此不能只使用
datacar=…|梅赛德斯a
:这意味着制造
汽车字符串的方法之一就是说
梅赛德斯“a”
,它与称为
梅赛德斯的类型没有关联。现在可以使用如下函数:

horsepower :: Car a -> Float
horsepower (Ford (ModelT _)) = 1
horsepower (Ford (Falcon _)) = 500
horsepower (Mercedes (CClass _)) = 300
horsepower (Mercedes (SClass _)) = 400
你的例子是:

myfunc :: Show a => Car a -> String
myfunc a = show a ++ " works correctly"

-- myfunc (Ford (ModelT "A")) => Ford (ModelT "A") works correctly
-- myfunc (Mercedes (CClass "b")) => Mercedes (CClass "b") works correctly

允许这种“子类型化”的另一种方法是使用类型类(根据具体情况,这可能是更好的选择)。例如

您的
myfunc
示例可能是:

myfunc :: (Car c) => c -> String
myfunc c = (make `asTypeOf` c) ++ " " ++ show c ++ " works correctly"

-- myfunc (ModelT "A") => Ford ModelT "A" works correctly
-- myfunc (CClass "b") => Mercedes CClass "b" works correctly

还请注意,必须使用括号调用函数,如
function(Ford(Ford“a”))
(或
function(CClass“a”)

要实现“子”类型,有几个选项。第一种方法是在尝试时使用更多的
数据
类型:

data Car a = Ford (Ford a) | Mercedes (Mercedes a) deriving (Show)

data Ford a = ModelT a | Falcon a deriving (Show) -- different Fords models
data Mercedes a = CClass a | SClass a deriving (Show) -- different Mercedes models
注意,作为类型构造函数不同于作为数据构造函数,因此不能只使用
datacar=…|梅赛德斯a
:这意味着制造
汽车字符串的方法之一就是说
梅赛德斯“a”
,它与称为
梅赛德斯的类型没有关联。现在可以使用如下函数:

horsepower :: Car a -> Float
horsepower (Ford (ModelT _)) = 1
horsepower (Ford (Falcon _)) = 500
horsepower (Mercedes (CClass _)) = 300
horsepower (Mercedes (SClass _)) = 400
你的例子是:

myfunc :: Show a => Car a -> String
myfunc a = show a ++ " works correctly"

-- myfunc (Ford (ModelT "A")) => Ford (ModelT "A") works correctly
-- myfunc (Mercedes (CClass "b")) => Mercedes (CClass "b") works correctly

允许这种“子类型化”的另一种方法是使用类型类(根据具体情况,这可能是更好的选择)。例如

您的
myfunc
示例可能是:

myfunc :: (Car c) => c -> String
myfunc c = (make `asTypeOf` c) ++ " " ++ show c ++ " works correctly"

-- myfunc (ModelT "A") => Ford ModelT "A" works correctly
-- myfunc (CClass "b") => Mercedes CClass "b" works correctly


还请注意,必须使用括号调用
函数(Ford(Ford“a”)
(或
函数(CClass“a”)
)等函数。

这有多个错误。“衍生(表演)”应将“表演”资本化。第二行似乎试图成为数据类型,但缺少“data”关键字(可能是错误消息的原因)。如果你这样做,那么你的类型将是有问题的,因为你将有“福特”类型的“汽车(梅赛德斯字符串)”。告诉我们您试图实现的目标。此外,您需要在
myfunc
中使用
show
,即
myfunc a=show a++“工作正常”
。我希望能够将任何车型转换为一个函数,该函数能够与车型模式匹配,并以不同的方式对待每个车型。看起来您也在思考“面向对象”,或者更确切地说是太多Java&co.称之为面向对象的风格。这样的示例可能会让您对这些语言中处理对象的方式有一个相当好的了解,但它们并没有真正意义。Haskell还有其他(更强大的)在做事情的方法上,您可能希望编写一些有趣的程序,而不是尝试将OO语言示例结构应用于Haskell。这有多个错误。“派生(显示)”应该大写“显示”。您的第二行似乎试图成为数据类型,但缺少“数据”关键字(可能是您的错误消息的原因)。如果您这样做,那么您的类型将出现问题,因为您的“Ford”类型为“Car(Mercedes String)”。请告诉我们您正在尝试实现什么。此外,您还需要在
myfunc
中使用
show
,即
myfunc a=show a++”工作正常“
。我希望能够将任何汽车模型传递到一个函数中,该函数能够与汽车模型进行模式匹配,并以不同的方式对待每个模型。看起来您的想法太“面向对象”,或者更确切地说,是Java&co.称之为面向对象的风格。这样的示例可能会让您对使用这些语言处理对象的方式有一个相当好的了解,但它们并不像现在这样有意义。Haskell还有其他(更强大的)做事情的方法是,你可能更愿意编写一些有趣的程序,而不是尝试将OO语言示例结构应用于Haskell。在myFunc中,我尝试在(C类a)上进行模式匹配,但它说无法将预期的类型Car a与实际的类型MercedesClass匹配a@peroni_santo您必须在梅赛德斯(C a类)上进行模式匹配
@peroni_santo in
let v=CClass“x”
a value
v
具有type
MercedesClass字符串
。然后,在
let c=Mercedes v
中,a value
c
具有type
Car字符串
。在myFunc中,我尝试进行模式匹配(CClass a)但它说,预期的a型车与实际的MercedesClass型车不匹配a@peroni_santo你必须在梅赛德斯a级车上进行模式匹配
a值
v
具有类型
MercedesClass字符串
。然后,在
中让c=Mercedes v
中,a值
c
具有类型
汽车字符串