我很难理解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,但是为什么函数实际上不计算该值并返回呢?我的印象是,答案实际上是正确的,但与此同时,我必须缺少一些基本概念,这使我无法注意到可能很明显的东西。
在此先感谢您的帮助!
答案 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