为什么我的Haskell函数返回类型而不是值?

时间:2020-09-20 16:03:47

标签: haskell types functional-programming

我很难理解Haskell中的类型创建。我试图理解为什么以下Haskell函数返回类型而不是值:

data Exp = Enum Int

data Val = Vnum Int

eval :: Exp -> Val
eval (Enum x) = Vnum x

x :: Exp
x = Enum 2

当我运行'eval x'时,解释器将返回'eval x :: Val',而不是我期望的那样返回2。 Enum和Vnum只是标签,因此从本质上讲,eval函数将“表达式”作为参数(实际上只是一个整数),并返回“值”,也不过是整数。

就像eval x当然返回一个Val,但是为什么函数实际上不计算该值并返回呢?我的印象是,答案实际上是正确的,但与此同时,我必须缺少一些基本概念,这使我无法注意到可能很明显的东西。

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:11)

我的Haskell函数为什么返回类型

不是。您的函数运行正常,并且eval x确实给出了类型为Val value

但是请注意,解释器无法显示此值-就其而言,这是一种完全不透明的类型。至少GHCi明确指出了这一点:

<interactive>:3:1: error:
    • No instance for (Show Val) arising from a use of ‘print’
    • In a stmt of an interactive GHCi command: print it

仅当您您真的只对类型感兴趣时,才可以使用:t:type指令来显示:

> :t eval (Enum 2)
eval (Enum 2) :: Val

启用值打印的最简单方法是派生 Show实例:

data Val = Vnum Int   -- incidentally, this should probably be `newtype`,
 deriving (Show)      -- rather than `data`
> eval (Enum 2)
Vnum 2