首页 > 解决方案 > 如何定义 Integral a => a 类型的函数?

问题描述

我们刚开始在 uni 学习 Haskell,在我的一个作业问题中,我们必须为这种类型签名定义一个函数:

f1 :: Integral a => a

老实说,我仍在尝试了解一些有关 Haskell 的基础知识,但我知道使用Integral, 你可以做moddiv,以及你可以用, 和Num+的那些。-*

所以我可以写

f1 :: Integral a=> a -> a
f1 k = k `mod` k

它会起作用。但随着

f1 :: Integral a => a

好像没有输出。

我怎样才能用这个写一些在解释时不会出错的东西?

标签: haskell

解决方案


你是对的,Integral没有那种形状的东西。但是Integral还有很多其他的东西,如果我们向上追溯层次结构,我们会看到 everyIntegral是 a Num,并且 eachNum

fromInteger :: Num a => Integer -> a

所以,对于你的功能,我们可以写

f1 :: Integral a => a
f1 = fromInteger 0

或者

f1 :: Integral a => a
f1 = fromInteger 42

或者,坦率地说,选择你最喜欢的号码。

此外,由于 Haskell 的魔法,字面42实际上是fromInteger 42(字面量42,在 Haskell 中,有 type Num a => a。所以这个函数也足够了。

f1 :: Integral a => a
f1 = 42

推荐阅读