作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
刚才我在 Haskell 中做一些代码高尔夫,我遇到了一个当时对我没有多大意义的错误。决定在 GHCi 中检查一下,现在我真的很困惑。
λ> :t replicate <$> readLn
replicate <$> readLn :: IO (a -> [a])
λ> f <- replicate <$> readLn
-- I type 4 and press Enter
λ> :t f
f :: GHC.Types.Any -> [GHC.Types.Any]
f
不属于
a -> [a]
类型?我可以
unsafeCoerce
,当然,但这是冗长而可怕的。
最佳答案
IO (a -> [a])
是一种多态类型。展开,表示forall a. IO (a -> [a])
.现在,有两件事在这里行不通。一,这是一个多态的IO
产生单态函数的 Action 。本质上,此操作的每次执行都会为一种类型生成一个函数。 a -> [a]
不是真正有效的类型,但如果你的意思是你想要一个 forall a. a -> [a]
,你不会得到一个:
main = do
f <- replicate <$> readLn
print (f (5 :: Int)) -- f can be *one of* Int -> [Int] or Float -> [Float], but not both
print (f (5 :: Float)) -- doesn't compile, comment either line out and it will
IO
正确操作,您可以将其设置为
IO (forall a. a -> [a])
,但 GHC 不支持将多态类型(如
forall a. a -> [a]
)放入容器中,如
IO
.
f
, GHC 不知道应该在哪个类型上实例化action,但它必须选择一个,所以它默认为
Any
.
newtypes
:
{-# LANGUAGE RankNTypes #-}
-- interestingly, this is a numeric type (it represents the natural numbers)
newtype Replicator = Replicator { runReplicator :: forall a. a -> [a] }
mkReplicator :: Int -> Replicator
mkReplicator i = Replicator (replicate i)
-- mkReplicator =# replicate
main = do
Replicator f <- mkReplicator <$> readLn
print (f (5 :: Int))
print (f (5 :: Float)) -- should work now
关于haskell - 为什么 GHC.Types.Any 在这里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61805899/
我是一名优秀的程序员,十分优秀!