小编npo*_*cop的帖子

针对依赖性挑战的数据类型升级

通过ghc 7.4阅读.预发行说明和给予Haskell一份推广文章,我仍然对你实际使用推广类型做了什么感到困惑.例如,GHC手册提供了有关提升数据类型的以下示例:

data Nat = Ze | Su Nat

data List a = Nil | Cons a (List a)

data Pair a b = Pair a b

data Sum a b = L a | R b
Run Code Online (Sandbox Code Playgroud)

这些有什么用途?你能给(代码)例子吗?

haskell types language-design dependent-type

36
推荐指数
2
解决办法
642
查看次数

米尔纳让多态性成为第2级特征吗?

let a = b in c可以被认为是一种语法糖(\a -> c) b,但在一般的打字环境中并非如此.例如,米尔纳微积分let a = \x -> x in (a True, a 1)是典型的,但看似等价(\a -> (a True, a 1)) (\x -> x)的不是.

但是,后者在系统F中是典型的,第一个lambda的等级为2.

我的问题是:

  • 让多态性成为在米尔纳微积分的其他排名1世界中偷偷潜入的2级特征?

  • 具有单独let构造的目的似乎指定哪些类型应该由类型检查器推广,哪些不是.它是否有任何其他用途?是否有任何理由扩展更强大的系统,例如系统F与单独let的不是糖?有没有关于米尔纳微积分设计背后的理由的论文,这对我来说似乎不再明显?

  • \a -> (a True, a 1)System F中是否有最常用的类型?

  • 是否在beta扩展下关闭了类型系统?即如果P是典型的并且MN = P那么M是典型的吗?

一些澄清:

  • 等价是指等价模数型注释.'System F a la Church'是正确的术语吗?

  • 我知道一般来说,主要的输入属性不能保存在F中,但是我的特定术语可能存在主体类型.

  • 通过let我的意思的非递归的味道let.使用递归let扩展系统F显然是有用的,因为它允许非终止.

polymorphism haskell type-systems

25
推荐指数
1
解决办法
1638
查看次数

了解Javascript/Node中闭包的变量捕获

除了标准之外,Javascript中的变量捕获是否有明确的来源(阅读标准是一种痛苦)?

在下面的代码i中按值复制:

for (var i = 0; i < 10; i++)
{
    (function (i)
    {
        process.nextTick(function ()
        {
            console.log(i)
        })
    }) (i)
}
Run Code Online (Sandbox Code Playgroud)

所以打印1..10.process.nextTicksetTimeout(f,0)节点的模拟.

但在下一个代码中我似乎没有被复制:

for (var i = 0; i < 10; i++)
{
        var j = i
        process.nextTick(function ()
        {
            console.log(j)
        })
}
Run Code Online (Sandbox Code Playgroud)

它打印9次10次.为什么?我对参考/一般文章比对解释捕获的具体情况更感兴趣.

javascript closures node.js

20
推荐指数
3
解决办法
1万
查看次数

用于学习惯用的Haskell(eta约简,符号中缀运算符,库等)的资源

尽管有一些Lisp和ML的经验,但我在学习阅读和(惯用)编写Haskell时遇到了很多麻烦,因为本地风格似乎是

  • 尽可能做到消除
  • 避免使用括号来支持运算符优先级
  • 将一半的逻辑打包到超载的非字母数字中缀运算符的桶中

最后一个特别困难,因为有很多预定义的运算符,每个运算符都有自己的约定和一般语义,经常阅读Haskell成为Hoogle和:type.

是否有任何好的教程假设CS /功能概念的知识,而是专注于Haskell特定的习语?我正在寻找类似Real-World Haskell的东西,它以一个非常幼稚,明确的程序开始,然后逐渐将其转换为更惯用的风格,介绍和解释成语.但是它不是引入和解释像monad和类类这样的一般概念,而是引入特定的monad和特定的类型类,比如"但这正是Alternative monoid所做的!"

haskell idioms

19
推荐指数
2
解决办法
3033
查看次数

打破Data.Set完整性而不使用GeneralizedNewtypeDeriving

下面的代码使用不安全的GeneralizedNewtypeDeriving扩展来Data.Set通过插入具有不同Ord实例的不同元素来中断:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Data.Set
import System.Random

class AlaInt i where
  fromIntSet :: Set Integer -> Set i
  toIntSet :: Set i -> Set Integer
instance AlaInt Integer where
  fromIntSet = id
  toIntSet = id
newtype I = I Integer deriving (Eq, Show, AlaInt)
instance Ord I where compare (I n1) (I n2) = compare n2 n1 -- sic!  

insert' :: Integer -> Set Integer -> Set Integer
insert' n s = …
Run Code Online (Sandbox Code Playgroud)

security haskell type-safety language-extension

18
推荐指数
1
解决办法
703
查看次数

单同性约束对类型约束的影响

baz添加类型声明时,此代码会中断:

baz (x:y:_) = x == y
baz [_] = baz []
baz [] = False
Run Code Online (Sandbox Code Playgroud)

一个常见的解释(请参阅为什么我不能声明推断类型?例如)是因为多态递归.

但是这个解释并没有解释为什么效果会随着另一个多态递归示例而消失:

foo f (x:y:_) = f x y
foo f [_] = foo f []
foo f [] = False
Run Code Online (Sandbox Code Playgroud)

它也没有解释为什么GHC认为在没有类型声明的情况下递归是单态的.

该示例与解释可以readshttp://www.haskell.org/onlinereport/decls.html#sect4.5.5适用于我的baz情况?

即添加一个签名会删除单态限制,并且没有限制,右侧[]的模糊性出现,具有"固有的暧昧"类型forall a . Eq a => [a]

polymorphism recursion haskell types monomorphism-restriction

17
推荐指数
2
解决办法
497
查看次数

如何以人类可读的形式转储GHC简化器输出?

我有以下程序:

data Peano = Zero | Succ Peano deriving (Show)

add Zero     b = b
add (Succ a) b = add a (Succ b)

mul Zero     b = Zero
mul (Succ a) b = add b (mul a b)

four x = let two = Succ (Succ Zero) in mul two two
Run Code Online (Sandbox Code Playgroud)

我想从GHC得到这样的东西:

add =
  \ ds b ->
    case ds of
      Zero ->
        b
      Succ a ->
        add
          a
          (Succ b)

mul =
  \ ds b ->
    case ds …
Run Code Online (Sandbox Code Playgroud)

command-line haskell ghc

14
推荐指数
1
解决办法
2573
查看次数

ST monad是否有特殊的编译器支持?

ST monad是否在GHC中有特殊的编译器支持?

monads haskell ghc

13
推荐指数
1
解决办法
645
查看次数

Haskell中非整数的整数居民

Haskell中的Peano自然数data Peano = Zero | Succ Peano被定义为非常奇怪的野兽:除了简单的自然和底值之外,其中还有一个"无限整数" inf = Succ inf.

还有其他Peano类型的居民吗?这个无限号码有名字吗?

haskell types integer infinity

11
推荐指数
2
解决办法
503
查看次数

递归方案的库实现

我发明了一种递归方案,这种方法是对同态性的推广.折叠具有catamorphism的数据结构时,您无法访问子项,只能访问折叠的子结果:

{-# LANGUAGE DeriveFunctor #-}
import qualified Data.Map as M

newtype Fix f = Fix { unFix :: f (Fix f) }

cata :: Functor f => (f b -> b) -> Fix f -> b
cata phi = self where
    self = phi . fmap (\x -> self x) . unFix
Run Code Online (Sandbox Code Playgroud)

折叠功能phi只能访问self x原始结果,但不能访问原始结果x.所以我添加了一个加入功能:

cataWithSubterm :: Functor f => (Fix f -> c -> b) -> (f b -> c) -> Fix f -> …
Run Code Online (Sandbox Code Playgroud)

recursion haskell catamorphism recursion-schemes

11
推荐指数
1
解决办法
507
查看次数