来自https://ghc.haskell.org/trac/ghc/wiki/DependentHaskell,
与Coq和Agda不同,Haskell依赖于强制语言的一致性,而不受*::*的威胁.有关详细信息,请参阅该文章.
引用的"论文"是一个断开的链接,但是,通过谷歌搜索并阅读它,我注意到它描述了如何向系统FC添加显式的类型相等,但没有直接解决隐含的问题:依赖于它的一致性是什么意思强制语言?
我在业余时间学习Haskell已经有几个月了.我想知道Haskell如何在当前库存硬件上执行内存子系统(L1,L2,L3缓存).有人可以指点我关于缓存友好是Haskell的任何报告/研究,因为它的懒惰评估/按需调用?有没有办法让我们获取有关发生了多少数据缓存未命中和指令缓存未命中的信息,看看这是否是由于该语言的惰性评估性质?
谢谢.
seq功能文档说明如下:
关于评估顺序的注释:表达式
seq a b不保证a将在之前进行评估b.给出的唯一保证seq是,既a和b会前进行评估seq返回一个值.特别是,这意味着b可以在之前进行评估a.如果需要保证特定的评估顺序,则必须使用pseq"并行"软件包中的功能.
所以我有一个sum带累加器的懒函数:
sum :: Num a => [a] -> a
sum = go 0
where
go acc [] = acc
go acc (x:xs) = go (x + acc) xs
Run Code Online (Sandbox Code Playgroud)
显然,这在大名单上非常缓慢.现在我用seq以下方法重写这个函数:
sum :: Num a => [a] -> a
sum = go 0
where
go acc [] = acc
go acc (x:xs) = …Run Code Online (Sandbox Code Playgroud) 功能decode和decode'从aeson封装几乎是相同的.但是它们在文档中描述了微妙的差异(这里仅发布有趣的文档部分):
-- This function parses immediately, but defers conversion. See
-- 'json' for details.
decode :: (FromJSON a) => L.ByteString -> Maybe a
decode = decodeWith jsonEOF fromJSON
-- This function parses and performs conversion immediately. See
-- 'json'' for details.
decode' :: (FromJSON a) => L.ByteString -> Maybe a
decode' = decodeWith jsonEOF' fromJSON
Run Code Online (Sandbox Code Playgroud)
我试着阅读描述json和json'功能,但仍然不明白哪一个以及何时应该使用,因为文档不够清晰.任何人都可以更准确地描述两个函数之间的区别,并提供一些行为解释的例子吗?
更新:
也有decodeStrict和decodeStrict'功能.我不要求什么区别decode'和decodeStrict例如它的方式是一个有趣的问题也是如此.但是在所有这些功能中,什么是懒惰的以及严格的内容并不明显.
我发现,当我使用该stack new the-project-name new-template命令时,会在新目录中生成许多文件.我注意到以下4个特殊文件:
package.yaml
stack.yaml
Setup.hs
the-project-name.cabal
Run Code Online (Sandbox Code Playgroud)
这4个文件似乎打算为软件包管理软件提供元数据,但它们看起来很混乱,我的意思是,为什么有4个,为什么不只是一个,它们之间有什么区别?
我有以下 Haskell 代码,可以完美编译:
import Control.Monad.Reader (Reader (..))
import Data.Coerce (Coercible, coerce)
data Flow i o = Flow (i -> o) (o -> i)
coerceFlow
:: (Coercible i i', Coercible o o')
=> Flow i o
-> Flow i' o'
coerceFlow = coerce
Run Code Online (Sandbox Code Playgroud)
但是,如果我将Flow类型的定义更改为以下内容:
data Flow i o = Flow (i -> Reader Int o) (o -> i)
Run Code Online (Sandbox Code Playgroud)
我开始看到一个奇怪的错误:
Coerce.hs:10:14: error:
• Couldn't match type ‘o’ with ‘o'’ arising from a use of ‘coerce’
‘o’ is a rigid type …Run Code Online (Sandbox Code Playgroud) 反向状态monad是非常好的,令人兴奋的Haskell语言表达性和懒惰评价的例子.但要理解这个单子并不容易.此外,很难找到一些令人信服的现实生活中的例子,说明你可以使用Reverse State monad比使用该语言中的任何其他工具更容易.
反向状态 monad的定义方式如下:
newtype RState s a = RState { runRState :: s -> (a,s) }
instance Monad (RState s) where
return x = RState $ (,) x
RState sf >>= f = RState $ \s ->
let (a, past) = sf future
(b, future) = runRState (f a) s
in (b, past)
Run Code Online (Sandbox Code Playgroud)
它已经有一些例子和用法,但我发现它们并不实用.
RState.Writer模仿,RState但来吧.不是真正的生活例子:)我也知道tardis包但没有这个库的教程,文档示例真的是抽象的,没有那么多人真正理解它.最接近我想要的是本教程,但它有一个例子tardis,而不仅仅是 …
该Contravariant类型类的家庭代表在Haskell的生态标准和基本抽象:
class Contravariant f where
contramap :: (a -> b) -> f b -> f a
class Contravariant f => Divisible f where
conquer :: f a
divide :: (a -> (b, c)) -> f b -> f c -> f a
class Divisible f => Decidable f where
lose :: (a -> Void) -> f a
choose :: (a -> Either b c) -> f b -> f c -> f a
Run Code Online (Sandbox Code Playgroud)
但是,要理解这些类型类的概念并不容易。我认为,如果可以看到一些反例,将有助于更好地理解这些类型。因此,本着“ 不是函子/函子/应用/单子”的榜样精神? …
最近,我试图在我的一些实际案例制作系统中使用Haskell。Haskell类型系统确实为我提供了很大的帮助。例如,当我意识到我需要某种类型的功能时
f :: (Foldable t, Monad m) => ( a-> b -> m b) -> b -> t a -> m b
Run Code Online (Sandbox Code Playgroud)
实际上有类似的功能foldM,foldlM和foldrM。
但是,真正令我震惊的是这些功能的定义,例如:
foldlM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b
foldlM f z0 xs = foldr f' return xs z0
where f' x k z = f z x >>= k
Run Code Online (Sandbox Code Playgroud)
因此函数f'必须为以下类型:
f' :: a -> b …Run Code Online (Sandbox Code Playgroud) 我有一个枚举类型,例如
data MyType = A | B
Run Code Online (Sandbox Code Playgroud)
我希望能够将这种类型的值隐式传递给我的函数。我可以使用ImplicitParamsGHC 扩展来做到这一点:
type HasMyType = (?myType :: MyType)
myFun :: HasMyType => String
myFun = case ?myType of
A -> "Foo"
B -> "Bar"
Run Code Online (Sandbox Code Playgroud)
但是我多次听说,最好使用 Haskell 包反射来完成这项任务。不幸的是,reflection文档没有解释如何使用库编写类似的代码。弄清楚它并不是那么简单。
所以,我的问题是,是否可以使用该reflection库来实现类似的代码并满足以下要求?
MyType应该隐式传递。HasMyType未指定约束,MyType则应采用默认值。HasMyType在一个地方覆盖通过约束传递的值,例如在应用程序的开头。这样的事情可能吗?或者使用reflection库最接近的近似值是什么?