- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我定义了一个函数:
gen :: a -> b
gen 2 = "test"
gen.hs:51:9:
Couldn't match expected type ‘b’ with actual type ‘[Char]’
‘b’ is a rigid type variable bound by
the type signature for gen :: a -> b at gen.hs:50:8
Relevant bindings include gen :: a -> b (bound at gen.hs:51:1)
In the expression: "test"
In an equation for ‘gen’: gen 2 = "test"
Failed, modules loaded: none.
a
未输入为 Int 和
b
没有输入为 String ?
最佳答案
这是一个很常见的误解。
要理解的关键是,如果您的类型签名中有一个变量,那么调用者可以决定它是什么类型,而不是您!
所以你不能说“这个函数返回类型 x
”然后只返回一个 String
;您的函数实际上必须能够返回调用者可能要求的任何可能类型。如果我要求您的函数返回 Int
,它必须返回一个 Int
.如果我要求它返回 Bool
,它必须返回一个 Bool
.
您的函数声称能够返回任何可能的类型,但实际上它只返回 String
.所以它不会做类型签名声称它做的事情。因此,编译时错误。
很多人显然误解了这一点。在(比如说)Java 中,你可以说“这个函数返回 Object
”,然后你的函数可以返回它想要的任何东西。所以函数决定它返回什么类型。在 Haskell 中,调用者可以决定返回什么类型,而不是函数。
编辑:注意你写的类型,a -> b
, 是不可能的。没有函数可以有这种类型。函数无法构造 b
类型的值凭空。唯一可行的方法是如果某些输入也涉及类型 b
,或者如果 b
属于某种允许值构造的类型类。
例如:
head :: [x] -> x
x
(“任何可能的类型”),但输入类型也提到了
x
,所以这个功能是可能的;您只需要返回原始列表中的值之一。
gen :: a -> a
是一个完全有效的函数。但它唯一能做的就是原封不动地返回它的输入(即
id
函数所做的)。
关于haskell - 对 Haskell 多态类型感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30217354/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!