higher-rank-types相关内容
更高等级的类型看起来很有趣.这个例子来自 Haskell wikibook: foo :: (forall a.a -> a) -> (Char,Bool)foo f = (f 'c', f True) 现在我们可以评估 foo id 而不会导致编译器爆炸.这个例子在本书后面很快出现了我在其他几个地方看到的真实例子:ST monad 和 runST.这很酷. 但是我还没有遇到过这样的情况
..
我了解 forall 是如何让我们编写多态函数的. 根据这个章节,我们一般写的普通函数是Rank 1类型.而这个函数是Rank 2类型的: foo :: (forall a.a -> a) ->(字符,布尔)foo f = (f 'c', f True) 它是这样解释的: 一般来说,rank-n 类型是一个函数,它至少有一个rank-(n-1) 参数,但没有更高级别的参数.
..
我们习惯于为多态函数使用通用量化的类型.存在量化类型的使用频率要低得多.我们如何使用通用类型量词来表达存在量化类型? 解决方案 事实证明,存在类型只是 Σ 类型(sigma 类型)的一个特例.它们是什么? Sigma 类型 正如 Π-types (pi types) 泛化我们的普通函数类型,允许结果类型依赖其参数的值,Σ-types 泛化对,允许第二个组件的类型依赖第一个值.
..
我不是很精通 Haskell,所以这可能是一个非常简单的问题. 什么语言限制Rank2Types 解决了吗?Haskell 中的函数不是已经支持多态参数了吗? 解决方案 Haskell 中的函数不是已经支持多态参数了吗? 他们有,但只有等级 1.这意味着虽然你可以编写一个没有这个扩展的接受不同类型参数的函数,但你不能编写一个在同一个调用中将其参数用作不同类型的函数.
..
我发现我可以说 {-#语言RankNTypes#-}f1 ::(forall b.b-> b)->(全部抄送-> c)f1 f = id f (而HLint告诉我我可以在这里进行“减少Eta"操作),但是 f2 ::(forall b.b-> b)->(全部抄送-> c)f2 = id 无法编译: 无法匹配预期的类型`c->C'实际类型为"forall" b.b->b'预期类型:
..
我很难理解高级类别和高级类别. Kind非常简单(这要感谢Haskell的文献资料),在讨论类型时,我曾经认为rank就像同类,但显然不是!我没有阅读维基百科文章.那么有人可以解释一下等级吗?高等级是什么意思?更高等级的多态性?怎么样(如果有的话)?比较Scala和Haskell也会很棒. 解决方案 等级的概念与种类的概念并没有真正的联系. 多态类型系统的等级描述了forall在类型
..
最近我一直在使用这种类型,我将其理解为自由分布仿函数的编码(有关其切线背景,请参见data Ev g a where Ev :: ((g x -> x) -> a) -> Ev g a deriving instance Functor (Ev g) 存在构造函数可确保我只能通过提供多态提取器forall x. g x -> x来使用Ev g,并且可以为自由构造的提升和降低功能指定兼容类型:
..
以下是代码: { - #LANGUAGE RankNTypes,FlexibleContexts,ScopedTypeVariables# - } 模块Foo其中 导入Data.Vector.Generic.Mutable为M 导入Data.Vector.Generic作为V 导入Control.Monad.ST 导入控件.Monad.Primitive import
..
我在Haskell中实现了换能器,如下所示: { - #LANGUAGE RankNTypes# - } 导入Prelude隐藏(foldr) 导入Data.Foldable 类型Reducer ba = a - > b - > b 型传感器a b = forall t。减速器t b - > Reducer t a class可折叠c => Collection c其中
..
我需要一个可以包含任意值的映射,只要它们的类型是相同的类型类型。我的第一个幼稚的方法是这样的: type HMap = forall a。 MyClass a => M.Map Int a 但是它似乎不起作用:下面的代码给出了一个编译错误: testFunction ::(a。MyClass a => M.Map Int a) - > Int - > IO(
..
下面介绍的所有实验均使用GHC 8.0.1完成。 这个问题是对
..
使用 RankNTypes ,我定义了一个不依赖于类型变量的类型。 我需要定义一些函数用于 ST s ,当然,它不依赖 s 。然而,这导致了一个问题,即具有两个 Int 的表达式应用于 Exp 并不会导致块。为什么? 这是一个复制器: import Control.Monad .ST 导入Data.Vector.Unboxed(Vector) 将合格的Data.Vector.
..
{ - #LANGUAGE ScopedTypeVariables,Rank2Types我想知道为什么这段代码没有进行类型检查: ,RankNTypes# - } { - #选项-fglasgow-exts# - } 模块Main其中 foo :: [forall a。 a] foo = [1] ghc抱怨: 无法从exists5.hs:7:7 $
..
说我有一个函数: f :: Int - > (Rational,Integer) fb =((toRational b)+1,(toInteger b)+1) 我想像这样抽象出(+1): f :: Int - > (Rational,Integer) fb =(h(toRational b) ,h(toInteger b)) where h =(+1)
..
据我所知,一种可判定的类型检查算法仅存在于rank-2类型中。 GHC是否在某种程度上使用了这个事实,它是否有任何实际意义? 是否还有rank-2类型的主要类型概念和类型推断算法?如果是的话,GHC是否使用它? Rank-2类型比rank- n 类型有其他优势吗? 解决方案 Rank2Types 是同义词用于 RankNTypes 。所以现在没有rank-2优于rank-n的优
..
我正在搞乱 runST 函数。其中有类型(forall s。ST s a) - >一个,它似乎试图以任何不直接应用而没有任何间接性的方式使用它,以非常讨厌的方式破坏它。 runST ::(forall s。ST sa) - > a const :: a - > b - > a 所以在 a c $ c> const 用于 forall s。 ST sa 你应该得到
..
{ - #LANGUAGE RankNTypes# - } 导入Control.Applicative 类型Lens ca = forall f。 Functor f => (a - > f a) - > (c - > f c) getWith ::(a - > b) - > ((a→Const b a)→(c→Const b c))→> (c - > b) getWith f
..
这些区别是什么? { - #LANGUAGE RankNTypes# - } f :: forall a。 a - > Int f _ = 1 g ::(forall a。a) - > Int g _ = 1 特别是,为什么我得到 g()? ghci> f() 1 ghci> g() :133:3: 无法与
..
较高的排名类型看起来非常有趣。这个例子来自 Haskell wikibook : foo ::(forall a。a - > a) - >(Char,Bool) foo f =(f'c',f True) 现在我们可以在没有编译器爆炸的情况下评估 foo id 。这个例子在本书中被我在其他一些地方看到的真实世界的例子迅速地追踪到:ST monad和 runST 。这很酷
..
(更新) 我使用免费Monad 到通用数据存储。我想将运行时用户选择的特定解释器(:: DataStore a - > IO a)与其他一些信息一起放入状态monad中。我似乎无法将任何东西放入数据结构的这个字段中。 如何将一个值放入定义为较高排名类型的字段中? $ $ b { - #LANGUAGE RankNTypes,DeriveFunctor# - } dat
..