标签: system-f

Haskell如何将Turing-completeness添加到System F?

我一直在阅读各种类型的系统和lambda calculi,我发现lambda立方体中的所有类型的lambda结石都是强烈正常化而不是图灵等效.这包括系统F,简单类型的lambda演算加多态.

这引出了以下问题,我一直无法找到任何可理解的答案:

  • (例如)Haskell的形式主义与表面上基于的微积分有何不同?
  • Haskell中的哪些语言功能不属于System F形式主义?
  • 允许图灵完整计算所需的最小变化是什么?

非常感谢你帮助我理解这一点.

haskell type-systems lambda-calculus turing-complete system-f

40
推荐指数
1
解决办法
2265
查看次数

如何系统地计算给定类型的居民数量?

如何系统地计算系统F中给定类型的居民数量?

假设有以下限制:

  • 所有居民终止,即没有底部.
  • 所有居民都缺乏副作用.

例如(使用Haskell语法):

  • Bool 有两个居民.
  • (Bool, Bool) 有四个居民.
  • Bool -> (Bool, Bool) 有十六个居民.
  • forall a. a -> a 有一个居民.
  • forall a. (a, a) -> (a, a) 有四个居民.
  • forall a b. a -> b -> a 有一个居民.
  • forall a. a 没有居民.

实现前三个算法是微不足道的,但我无法弄清楚如何为其他算法做到这一点.

algorithm type-theory system-f

19
推荐指数
1
解决办法
301
查看次数

根据存在类型编码通用类型?

在系统F中,类型exists a. P可以被编码为forall b. (forall a. P -> b) -> b使用存在性的任何系统F术语可以根据关于打字和缩减规则的该编码来表达.

在"类型和编程语言"中,将显示以下练习:

我们可以根据存在类型编码通用类型吗?

我的直觉说这是不可能的,因为在某种程度上,"存在包装"机制并不像"类型抽象"机制那样强大.我如何正式展示这个?

我甚至不确定我需要证明什么才能正式显示这个结果.

type-theory lambda-calculus existential-type system-f

10
推荐指数
0
解决办法
484
查看次数

表征可以接受`()`作为输入的函数类型(没有单态化)

下面是几个简单的函数:

f1 :: () -> ()
f1 () = ()

f2 :: a -> a
f2 a = a

f3 :: a -> (a, a)
f3 a = (a, a)

f4 :: (a, b) -> a
f4 (a, b) = a
Run Code Online (Sandbox Code Playgroud)

所有的f1f2以及f3能够接受()为输入。另一方面,当然f4不能接受()f4 ()是类型错误。

是否有可能TYPE-理论上刻画了什么f1f2以及f3有什么共同点?具体而言,是有可能定义一个acceptsUnit函数,以使得acceptsUnit f1acceptsUnit f2acceptsUnit f3是公类型的,但acceptsUnit f4是一种类型的错误-和不具有其他的效果?

下面完成了部分工作,但将其输入单态化(在 Haskell …

polymorphism haskell type-theory hindley-milner system-f

9
推荐指数
1
解决办法
147
查看次数

系统F中的类型示例,在Hindley Milner类型推断中不可用

根据'什么是Hindley Milner',它说:

Hindley-Milner是System F的限制,它允许更多类型但需要程序员注释.

我的问题是,什么是系统F中可用的类型的例子,在Hindley Milner(类型推断)中不可用?

(假设系统F类型的推断已被证明是不可判定的)

types inference type-inference hindley-milner system-f

8
推荐指数
2
解决办法
1223
查看次数

在GHC Haskell中键入抽象

我想得到以下示例进行类型检查:

{-# LANGUAGE AllowAmbiguousTypes    #-}
{-# LANGUAGE RankNTypes             #-}
{-# LANGUAGE TypeApplications       #-}
{-# LANGUAGE TypeFamilies           #-}

module Foo where

f :: Int -> (forall f. Functor f => Secret f) -> Int
f x _ = x

g :: (forall f. Functor f => Secret f) -> Int
g = f 4

type family Secret (f :: * -> *) :: * where
  Secret f = Int
Run Code Online (Sandbox Code Playgroud)

我得知它可能无法推断和检查gs类型(即使在这种特定情况下它很明显,因为它只是一个部分应用程序):Secret不是单射的,并且没有办法告诉编译器Functor它应该期望哪个实例.因此,它失败并显示以下错误消息:

    • Could not deduce (Functor …
Run Code Online (Sandbox Code Playgroud)

haskell existential-type type-families system-f

6
推荐指数
1
解决办法
268
查看次数

Haskell不想输入高级多态性

我不明白为什么这个程序不可打字:

type Test a = forall z. (a -> z) -> z

cons :: a -> Test a
cons = \a -> \p -> p a

type Identity = forall x. x -> x

t :: Identity
t = \x -> x

c :: Test Identity
c = cons (t :: Identity)

main :: IO ()
main = do{
  print "test"
}
Run Code Online (Sandbox Code Playgroud)

我使用-XRankNTypesGHC 选项.

我有以下错误:

Couldn't match type `x0 -> x0' with `forall x. x -> x'
Expected …
Run Code Online (Sandbox Code Playgroud)

polymorphism haskell type-inference system-f

4
推荐指数
1
解决办法
94
查看次数