小编She*_*rsh的帖子

依靠强制语言的一致性意味着什么?

来自https://ghc.haskell.org/trac/ghc/wiki/DependentHaskell,

与Coq和Agda不同,Haskell依赖于强制语言的一致性,而不受*::*的威胁.有关详细信息,请参阅该文章.

引用的"论文"是一个断开的链接,但是,通过谷歌搜索并阅读它,我注意到它描述了如何向系统FC添加显式的类型相等,但没有直接解决隐含的问题:依赖于它的一致性是什么意思强制语言

haskell functional-programming coercion

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

Haskell:如何"缓存"友好是Lazy Eval /需要调用

我在业余时间学习Haskell已经有几个月了.我想知道Haskell如何在当前库存硬件上执行内存子系统(L1,L2,L3缓存).有人可以指点我关于缓存友好是Haskell的任何报告/研究,因为它的懒惰评估/按需调用?有没有办法让我们获取有关发生了多少数据缓存未命中和指令缓存未命中的信息,看看这是否是由于该语言的惰性评估性质?

谢谢.

caching haskell lazy-evaluation call-by-need

17
推荐指数
1
解决办法
513
查看次数

始终保证`seq`的评估顺序(另外还有'pseq`的奇怪行为)

seq功能文档说明如下:

关于评估顺序的注释:表达式seq a b不保证a将在之前进行评估b.给出的唯一保证seq是,既ab会前进行评估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)

haskell lazy-evaluation operator-precedence ghc

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

aeson包的解码和解码功能有什么区别?

功能decodedecode'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)

我试着阅读描述jsonjson'功能,但仍然不明白哪一个以及何时应该使用,因为文档不够清晰.任何人都可以更准确地描述两个函数之间的区别,并提供一些行为解释的例子吗?

更新:

也有decodeStrictdecodeStrict'功能.我不要求什么区别decode'decodeStrict例如它的方式是一个有趣的问题也是如此.但是在所有这些功能中,什么是懒惰的以及严格的内容并不明显.

json haskell decoding lazy-evaluation aeson

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

什么是package.yaml&stack.yaml&Setup.hs&the-project-name.cabal文件?

我发现,当我使用该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 cabal haskell-stack

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

无法使用“Reader”作为字段来“强制”数据类型

我有以下 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)

haskell coercion coerce newtype

10
推荐指数
1
解决办法
127
查看次数

Reverse State monad的现实生活和有用的例子

反向状态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)

它已经有一些例子和用法,但我发现它们并不实用.

  1. Quora回答:很好地解释,甚至有现实生活中的使用例子但没有代码,并且不清楚它是否是一个非常好的主意RState.
  2. Mindfuck:介绍这个很好的概念但是例子没用.没有人会这样写斐波那契数字.
  3. Kwang的Haskell博客:展示如何Writer模仿,RState但来吧.不是真正的生活例子:)

我也知道tardis包但没有这个库的教程,文档示例真的是抽象的,没有那么多人真正理解它.最接近我想要的是本教程,但它有一个例子tardis,而不仅仅是 …

haskell lazy-evaluation state-monad

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

不是对立/对立/可分解/可判定的好例子?

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 functor typeclass contravariant

9
推荐指数
2
解决办法
564
查看次数

某人写下这样的foldlM定义需要什么知识或培训?

最近,我试图在我的一些实际案例制作系统中使用Haskell。Haskell类型系统确实为我提供了很大的帮助。例如,当我意识到我需要某种类型的功能时

f :: (Foldable t, Monad m) => ( a-> b -> m b) -> b -> t a -> m b
Run Code Online (Sandbox Code Playgroud)

实际上有类似的功能foldMfoldlMfoldrM

但是,真正令我震惊的是这些功能的定义,例如:

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)

haskell fold higher-order-functions

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

如何用“反射”包替换 ImplicitParams?

我有一个枚举类型,例如

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库来实现类似的代码并满足以下要求?

  1. 的值MyType应该隐式传递。
  2. 如果HasMyType未指定约束,MyType则应采用默认值。
  3. 应该可以HasMyType在一个地方覆盖通过约束传递的值,例如在应用程序的开头。

这样的事情可能吗?或者使用reflection库最接近的近似值是什么?

reflection haskell typeclass implicit-parameters

8
推荐指数
1
解决办法
137
查看次数