在 haskell 中定义类型

问题描述 投票:0回答:2

我今天参加考试时遇到了这个问题:在 Haskell 中找到具有这种特定类型的表达式或函数定义

:: (Num a, Enum a) => [a]

我该怎么做?

或者如果没有参数作为函数的输入,这是否可能?

haskell functional-programming
2个回答
1
投票

如果您被允许访问互联网,您可以询问 Hoogle,但否则,我的处理方法如下:

考虑给你的构建模块。您可以使用

Num
Enum
定义的所有函数或值,但仅此而已。要求您建议的值不是一个函数(它不需要输入),因此如果您想要任何值,则必须从这两个类型类中构造出值。

我认为最简单的表达方式就是返回空列表:

foo = []

这个本身具有类型

[a]
,但是如果你对它进行注释,你可以人为地约束它:

foo :: (Num a, Enum a) => [a]
foo = []

这是可能的,但可能被视为作弊。如果是这样,请继续实际查看

Num
Enum
提供了哪些构建块。

最丰富的实现来源似乎是

Num
,因为它定义了
fromInteger
。使用这个函数,您可以实现无限多个
Num a => [a]
类型的表达式,例如

[fromInteger 1]
[fromInteger 2]
[fromInteger 3]

我相信您已经明白了...从那里,您可以考虑是否可以以某种方式使用

Enum
中的功能。

怎么样

enumFromThen

enumFromThen (fromInteger 1) (fromInteger 9)
enumFromThen (fromInteger 2) (fromInteger 8)
enumFromThen (fromInteger 3) (fromInteger 7)

等等...

如果我正确理解了这个问题,你只需要举个例子。如果是这样,我希望这些应该足够了。


0
投票

这种类型的函数的一个例子是:

thing :: (Num a, Enum a) => [a]
thing = [9001]

Haskell 中的数字文字是多态的,整数类型有一个

Enum
实例。

您可以在调用站点上决定实际的具体类型(专业化),例如,

intThing :: [Int]
intThing = thing

integerThing :: [Integer]
integerThing = thing
© www.soinside.com 2019 - 2024. All rights reserved.