[英]Why does my Haskell function return a type instead of a value?
我很难理解 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,但为什么函数实际上不计算值并返回它? 我的印象是答案在我的脸上,但与此同时,我必须遗漏一些基本概念,这使我无法注意到可能很明显的事情。
在此先感谢您的帮助!
为什么我的 Haskell 函数返回一个类型
它没有。 你的函数工作得很好, eval x
确实给出了一个Val
类型的值。
但是请注意,解释器无法显示此值 - 就它而言,这是一种完全不透明的类型。 至少 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.