作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是几个简单的函数:
f1 :: () -> ()
f1 () = ()
f2 :: a -> a
f2 a = a
f3 :: a -> (a, a)
f3 a = (a, a)
f4 :: (a, b) -> a
f4 (a, b) = a
所有
f1
,
f2
, 和
f3
能够接受
()
作为输入。另一方面,当然,
f4
不能接受
()
;
f4 ()
是类型错误。
f1
,
f2
, 和
f3
有共同点?具体来说,是否可以定义
acceptsUnit
函数,这样
acceptsUnit f1
,
acceptsUnit f2
, 和
acceptsUnit f3
类型正确,但
acceptsUnit f4
是类型错误 - 并且没有其他影响?
()
:
acceptsUnit :: (() -> a) -> (() -> a)
acceptsUnit = id
-- acceptsUnit f4 ~> error 😊
-- acceptsUnit f3 'a' ~> error ☹️
当然,同样的单态化也发生在下面。在这种情况下,
acceptsUnit'
的注释类型是它的主要类型。
acceptsUnit' :: (() -> a) -> (() -> a)
acceptsUnit' f = let x = f () in f
最佳答案
f1
很容易从类型理论上描述什么, f2
, 和 f3
但不是 f4
有共同点。在 Hindley-Milner 的语言中,前三个具有可以专门化为以下形式的多型的多型:
forall a1...an. () -> tau
对于 n >= 0 和 tau 任意单型。第四个不行。
acceptsUnit :: (() -> a) -> (b -> c) -> (b -> c)
acceptsUnit = flip const
f1 :: () -> ()
f1 () = ()
f2 :: a -> a
f2 a = a
f3 :: a -> (a, a)
f3 a = (a, a)
f4 :: (a, b) -> a
f4 (a, b) = a
main = do
print $ acceptsUnit f1 f1 ()
print $ acceptsUnit f2 f2 10
print $ acceptsUnit f3 f3 10
-- print $ acceptsUnit f4 f4 -- type error
这可能是您使用标准 Haskell 可以做到的最好的事情(并且可能是使用 Haskell 和 GHC 类型系统扩展可以做到的最好的事情,或者有人现在已经找到了一些东西)。
关于haskell - 表征可以接受 `()` 作为输入的函数类型(不进行单态化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68551380/
我只是想确定我这样做是否正确。我正在尝试计算在 java 中最坏情况下执行的操作数 int sum = 0; for (int i = 0; i < n; i++ ) sum++; 操
我是一名优秀的程序员,十分优秀!