在 haskell 中定义类型

Sla*_*ama 2 haskell functional-programming

我今天参加考试时遇到了这个问题:在 Haskell 中查找具有此特定类型的表达式或函数定义:: (Num a, Enum a) => [a]

我该怎么做?

或者在没有参数作为函数输入的情况下这是否可能?

Mar*_*ann 5

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

考虑一下你得到的构建模块。Num您可以使用和定义的所有函数或值Enum,但仅此而已。要求您建议的值不是一个函数(它不需要输入),因此如果您想要任何值,则必须从这两个类型类中构造出值。

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

foo = []
Run Code Online (Sandbox Code Playgroud)

它本身具有 type [a],但如果您对其进行注释,则可以人为地约束它:

foo :: (Num a, Enum a) => [a]
foo = []
Run Code Online (Sandbox Code Playgroud)

这是可能的,但可能被视为作弊。如果是这样,请继续实际查看Num和提供了哪些构建块Enum

最丰富的实现来源似乎是Num,因为它定义了fromInteger. 使用这个函数,您可以实现无限多个类型的表达式Num a => [a],例如

[fromInteger 1]
[fromInteger 2]
[fromInteger 3]
Run Code Online (Sandbox Code Playgroud)

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

怎么样enumFromThen

enumFromThen (fromInteger 1) (fromInteger 9)
enumFromThen (fromInteger 2) (fromInteger 8)
enumFromThen (fromInteger 3) (fromInteger 7)
Run Code Online (Sandbox Code Playgroud)

等等...

现在,事实证明数字文字已经被视为Num值,因此您实际上可以将上面的内容简化为

enumFromThen 1 9
Run Code Online (Sandbox Code Playgroud)

等等。

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