Haskell:类型与模式匹配

3

我是一名大二学生,最近开始学习Haskell。我的问题与类型处理与模式匹配有关。我定义了一个包含不同参数以及汽车变速箱是否为手动或自动的类型Car,如下所示:

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

这个解决方案到目前为止在模式匹配汽车方面表现得非常出色,但是现在我需要一个以汽车为输入并返回Stick / Automatic信息的函数,并且不想将Stick / Automatic处理更改为字符串处理。 我不知道该指定什么返回类型。 那个返回类型会是什么?

2个回答

14
您可以为传输类型引入一个新类型:
data TransmissionType = Stick | Automatic

并将您对汽车的定义更改为:

data Car = Car TransmissionType [Char] Integer

您可以添加一个函数来获取类型。
transmissionType :: Car -> TransmissionType
transmissionType (Car t _ _) = t

由于您只有一个构造函数,因此可以使用记录(records):

data Car = Car {
    transmissionType :: TransmissionType,
    field1 :: [Char],
    field2 :: Integer
}

如果您不想改变您的定义,您可以添加一个函数。
isManual :: Car -> Bool
isManual (Stick _ _) = True
isManual (Automatic _ _) = False

-6
在Haskell中,你在代码(声明中)编写的返回类型不是给编译器看的,而是给你自己看的。编译器会找出你的函数类型,然后检查你是否正确。
我建议你做的是,先制作你需要的函数(我还没有真正弄清楚应该是什么)。在完成后,打开ghci(编译器,交互式),加载你的代码。然后使用:t让编译器找出它的类型。如果你想的话,可以在声明中写下它的类型,但这并不是必要的。
$ ghci
prelude> :load yourfile
prelude> :t yourfunction

-1 类型推断并不是魔法,你仍然需要对返回类型有一些了解。 - daniel gratzer
你不需要写出类型,但如果你无法自己弄清楚,那就意味着你实际上不知道你的程序在做什么。 - Cubic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接