haskell - 为什么我的 Haskell 函数返回的是类型而不是值?
问题描述
我很难理解 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”时,解释器并没有像我预期的那样返回 2,而是返回“eval x :: Val”。Enum 和 Vnum 只是标签,所以基本上 eval 函数接受一个“表达式”作为参数,实际上只是一个整数,并返回一个“值”,也就是一个整数。
就像,当然 eval x 返回一个 Val,但是为什么该函数实际上并没有计算该值并返回它呢?我的印象是答案就在我的脸上,但与此同时,我一定错过了一些基本概念,这使我无法注意到一些可能很明显的东西。
在此先感谢您的帮助!
解决方案
为什么我的 Haskell 函数返回一个类型
它没有。您的函数工作得很好,eval x
并且确实给出了type的值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
or: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
推荐阅读
- java - PersistenceException:错误:编码“UTF8”的字节序列无效
- python - 在 Python 中,如何在 2D 列表中找到内部列表的最大长度?
- firebase - 从工具菜单中选择 Firebase 时,Firebase 助手显示错误
- java - 我的异步调用做错了什么?
- javascript - 如何在 Wordpress 中正确使用克隆主题
- python - 如何创建一个熊猫数据框数组,其特定列的值始终大于特定列 - 通过使用 np.random.randint
- r - Windows 上的 R 包检查问题:建议的包但不可用:'stringi'
- angular - 在 Angular 子组件中获取 Route 参数
- node.js - 节点中已删除文件的文件信息和文件时间戳,chokidar
- php - PHP:如何将记录从一个表复制到另一个但它必须复制到某个值