3

我是二年级本科生,刚刚开始学习 Haskell。我的问题是关于类型处理与模式匹配。如果汽车的变速箱是手动变速箱还是自动变速箱,我已经定义了一个包含不同参数和规格的 Car 类型,如下所示:

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

到目前为止,该解决方案对于模式匹配汽车非常有效,但现在我需要一个函数,它将汽车作为输入并返回 Stick/Automatic 信息,并且不想将 Stick/Automatic 处理更改为字符串-处理。我不知道为该函数指定什么返回类型。那个返回类型是什么?

4

2 回答 2

14

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

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
于 2013-11-10T14:16:30.070 回答
-6

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

我建议你做的是制作你需要的功能。(我还没有真正弄清楚应该是什么。)完成之后,打开 ghci(编译器,交互式),加载您的代码。然后使用 :t 让编译器找出它是什么类型。然后,您可以根据需要将其写在声明中。这不是必要的。

$ ghci
prelude> :load yourfile
prelude> :t yourfunction
于 2013-11-10T14:15:51.953 回答