Haskell:类型与模式匹配

Haskell:类型与模式匹配,haskell,Haskell,我是研究生二年级的学生,刚刚开始学习Haskell。我的问题是关于类型处理和模式匹配。我定义了一种包含不同参数和规格的汽车类型,如果汽车的变速箱是斗杆式或自动变速箱,如下所示: data Car = Stick [Char] Integer | Automatic [Char] Integer 到目前为止,这个解决方案在模式匹配汽车上运行得非常出色,但现在我需要一个函数,它将汽车作为输入并返回斗杆/自动信息,并且不希望必须将斗杆/自动处理更改为字符串处理。我不知道要为该函数指定什么返回类型。返

我是研究生二年级的学生,刚刚开始学习Haskell。我的问题是关于类型处理和模式匹配。我定义了一种包含不同参数和规格的汽车类型,如果汽车的变速箱是斗杆式或自动变速箱,如下所示:

data Car = Stick [Char] Integer | Automatic [Char] Integer

到目前为止,这个解决方案在模式匹配汽车上运行得非常出色,但现在我需要一个函数,它将汽车作为输入并返回斗杆/自动信息,并且不希望必须将斗杆/自动处理更改为字符串处理。我不知道要为该函数指定什么返回类型。返回类型是什么?

在Haskell中,您在代码(声明中)中编写的返回类型不适用于编译器。是给你的。编译器计算出函数的类型,然后检查是否正确

我建议你做的是做你需要的功能。(我还没有真正弄明白应该是什么。)完成后,打开ghci(编译器,交互式),加载代码。然后使用:t让编译器知道它是什么类型。如果你愿意,你可以把它写在声明中。这是没有必要的

$ ghci
prelude> :load yourfile
prelude> :t yourfunction

您可以为传输类型引入一种新类型:

data TransmissionType = Stick | Automatic
并将您对汽车的定义更改为:

data Car = Car TransmissionType [Char] Integer
然后可以添加一个函数来获取类型

transmissionType :: Car -> TransmissionType
transmissionType (Car t _ _) = t
由于您只有一个构造函数,因此可以使用记录:

data Car = Car {
    transmissionType :: TransmissionType,
    field1 :: [Char],
    field2 :: Integer
}
如果不想更改定义,可以添加一个函数

isManual :: Car -> Bool
isManual (Stick _ _) = True
isManual (Automatic _ _) = False

-1类型推断并不神奇,你仍然需要对返回类型有一些概念,你不需要写下类型,但是如果你不能自己弄清楚,那就意味着你不知道你的程序在做什么。