【发布时间】:2019-12-22 07:24:05
【问题描述】:
我试过这个实验:
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE RankNTypes #-}
wrapper :: forall a (b :: * -> *). Monad b => Int -> a -> b a
wrapper 1 v = return v
wrapper n v = return $ wrapper (n-1) v
但它给了我错误:
Occurs check: cannot construct the infinite type: a ~ b0 a
Expected type: b a
Actual type: b (b0 a)
• In the expression: return $ wrapper (n - 1) v
In an equation for ‘wrapper’:
wrapper n v = return $ wrapper (n - 1) v
• Relevant bindings include
v :: a (bound at main.hs:7:11)
wrapper :: Int -> a -> b a (bound at main.hs:6:1)
是否可以创建函数包装器,例如:
wrapper 4 'a' :: [Char]
[[[['a']]]]
【问题讨论】:
-
无限类型在任何情况下都是不可能的。您必须将这种复杂性隐藏在构造函数后面。但是,这与无限列表相同,例如
foo = () : foo。相关问题:stackoverflow.com/questions/9566683/…
标签: haskell rank-n-types