我今天参加考试时遇到了这个问题:在 Haskell 中找到具有这种特定类型的表达式或函数定义
:: (Num a, Enum a) => [a]
我该怎么做?
或者如果没有参数作为函数的输入,这是否可能?
如果您被允许访问互联网,您可以询问 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)
等等...
如果我正确理解了这个问题,你只需要举个例子。如果是这样,我希望这些应该足够了。
这种类型的函数的一个例子是:
thing :: (Num a, Enum a) => [a]
thing = [9001]
Haskell 中的数字文字是多态的,整数类型有一个
Enum
实例。
您可以在调用站点上决定实际的具体类型(专业化),例如,
intThing :: [Int]
intThing = thing
或
integerThing :: [Integer]
integerThing = thing