我看到几个消息来源反映了"Haskell逐渐成为一种依赖型语言"的观点.暗示似乎是随着越来越多的语言扩展,Haskell正朝着这个方向漂移,但还没有.
基本上我想知道两件事.首先,很简单,"作为一种依赖型语言"究竟意味着什么?(希望没有太过技术性.)
第二个问题是......有什么缺点?我的意思是,人们知道我们正朝着这个方向前进,所以必须有一些优势.然而,我们还没有,所以必须有一些下行阻止人们一路走下去.我的印象是问题是复杂性急剧增加.但是,并不是真正了解依赖打字是什么,我不确定.
我所知道的是,每次我开始阅读一种依赖类型的编程语言时,文本都是完全不可理解的......大概这就是问题所在.(?)
我是Agda的新手.我正在阅读Ana Bove和Peter Dybjer的论文"工作中的依赖类型".我不理解有限集的讨论(在我的副本中的第15页).
本文定义了一种Fin类型:
data Fin : Nat -> Set where
fzero : {n : Nat} -> Fin (succ n)
fsucc : {n : Nat} -> Fin n -> Fin (succ n)
Run Code Online (Sandbox Code Playgroud)
我一定错过了一些明显的东西.我不明白这个定义是如何工作的.有人可以简单地将定义翻译Fin成日常英语吗?这可能是我需要理解本文的这一部分.
感谢您抽出宝贵时间阅读我的问题.我很感激.
记住这个计划:
class Convert a b where
convert :: a -> b
data A = A deriving Show
data B = B deriving Show
data C = C deriving Show
data D = DA A | DB B | DC C deriving Show
instance Convert A A where convert A = A
instance Convert A B where convert A = B
instance Convert A C where convert A = C
instance Convert B A where convert B = A
instance Convert …Run Code Online (Sandbox Code Playgroud) 把我的脚趾浸入依赖类型的水域,我在规范的"静态类型长度列表"示例中有一个裂缝.
{-# LANGUAGE DataKinds, GADTs, KindSignatures #-}
-- a kind declaration
data Nat = Z | S Nat
data SafeList :: (Nat -> * -> *) where
Nil :: SafeList Z a
Cons :: a -> SafeList n a -> SafeList (S n) a
-- the type signature ensures that the input list has at least one element
safeHead :: SafeList (S n) a -> a
safeHead (Cons x xs) = x
Run Code Online (Sandbox Code Playgroud)
这似乎有效:
ghci> :t Cons 5 (Cons 3 Nil) …Run Code Online (Sandbox Code Playgroud) 我很难理解描述反射包的文档/示例。我是命令式编程的老手,但还是 Haskell 新手。你能带我做一个非常简单的介绍吗?
包:https : //hackage.haskell.org/package/reflection
编辑:致关闭这个问题的人:这是对 Haskell 反射的初学者介绍。下面的答案很好,其他的也很有用,所以请重新打开。
我对依赖类型语言感兴趣.有限数字对我来说似乎非常有用.例如,安全地索引固定大小的数组.但这个定义对我来说并不清楚.
Idris中有限数字的数据类型如下:(并且在Agda中可能类似)
data FiniteNum : Natural -> Type where
FZero : FiniteNum (Succ k)
FSucc : FiniteNum k -> FiniteNum (Succ k)
Run Code Online (Sandbox Code Playgroud)
它似乎工作:
exampleFN : FiniteNum (Succ (Succ Zero))
exampleFN = FSucc FZero -- typechecks
-- exampleFN = FSucc (FSucc FZero) -- won't typecheck
Run Code Online (Sandbox Code Playgroud)
但这是如何工作的?k是什么意思?为什么类型检查器接受第一个实现并拒绝第二个?
我正在开发一个haskell项目,其中设置当前在一个名为的文件中Setting.hs,因此它们在编译期间被检查并可以全局访问.
但是,由于这有点太静态,我正在考虑在运行时读取配置.代码库是巨大的,似乎将相当大的努力传递给整个程序流程中的参数,例如作为参数,因为它们可以从任何地方任意访问.
是否有任何设计模式,库甚至ghc扩展可以在不重构整个代码的情况下提供帮助?