通过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)
这些有什么用途?你能给(代码)例子吗?
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显然是有用的,因为它允许非终止.
除了标准之外,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.nextTick是setTimeout(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次.为什么?我对参考/一般文章比对解释捕获的具体情况更感兴趣.
尽管有一些Lisp和ML的经验,但我在学习阅读和(惯用)编写Haskell时遇到了很多麻烦,因为本地风格似乎是
最后一个特别困难,因为有很多预定义的运算符,每个运算符都有自己的约定和一般语义,经常阅读Haskell成为Hoogle和:type.
是否有任何好的教程假设CS /功能概念的知识,而是专注于Haskell特定的习语?我正在寻找类似Real-World Haskell的东西,它以一个非常幼稚,明确的程序开始,然后逐渐将其转换为更惯用的风格,介绍和解释成语.但是它不是引入和解释像monad和类类这样的一般概念,而是引入特定的monad和特定的类型类,比如"但这正是Alternative monoid所做的!"
下面的代码使用不安全的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) 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认为在没有类型声明的情况下递归是单态的.
该示例与解释可以reads在http://www.haskell.org/onlinereport/decls.html#sect4.5.5适用于我的baz情况?
即添加一个签名会删除单态限制,并且没有限制,右侧[]的模糊性出现,具有"固有的暧昧"类型forall a . Eq a => [a]?
polymorphism recursion haskell types monomorphism-restriction
我有以下程序:
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) Haskell中的Peano自然数data Peano = Zero | Succ Peano被定义为非常奇怪的野兽:除了简单的自然和底值之外,其中还有一个"无限整数" inf = Succ inf.
还有其他Peano类型的居民吗?这个无限号码有名字吗?
我发明了一种递归方案,这种方法是对同态性的推广.折叠具有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) haskell ×9
types ×3
ghc ×2
polymorphism ×2
recursion ×2
catamorphism ×1
closures ×1
command-line ×1
idioms ×1
infinity ×1
integer ×1
javascript ×1
monads ×1
node.js ×1
security ×1
type-safety ×1
type-systems ×1