小编dup*_*ode的帖子

可折叠,Monoid和Monad

考虑以下签名 foldMap

foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m
Run Code Online (Sandbox Code Playgroud)

这与"绑定"非常相似,只是交换了参数:

(>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)

在我看来,有因此必须有某种关系的Foldable,MonoidMonad,但在超我找不到它.据推测,我可以将其中的一个或两个转换为另一个,但我不确定如何.

这种关系可以详细说明吗?

haskell category-theory foldable

25
推荐指数
3
解决办法
1988
查看次数

了解Haskell的堆栈程序以及解析器和LTS版本

我想了解如何使用stack和stackage.org.当我第一次安装并使用它时,stackage.org是在LTS-3.8("解析器").从那以后,stackage.org现在有了LTS-3.11.

首先,我想确认一下这意味着什么.Stackage是一个包的存储库,对于特定的LTS版本(例如3.8),包已经被验证可以一起工作.所以LTS-3.8的包装一起工作,LTS-3.11的包装也一起工作.继续 ...

当我跑步时stack new projectname,堆栈告诉我:

Checking against build plan lts-3.8
Selected resolver: lts-3.8
Run Code Online (Sandbox Code Playgroud)

这是否意味着该项目已设置为仅使用在LTS-3.8下验证的软件包和版本?

如果我现在想要启动一个新项目并希望在新项目中使用最新的LTS版本,我如何告诉堆栈默认执行此操作?

如果我想"升级"旧项目以使用新的LTS版本呢?

haskell haskell-stack

23
推荐指数
1
解决办法
4110
查看次数

亵渎者和箭头之间的关系是什么?

显然,每个人Arrow都是一个Strong教练.确实^>>>>^对应lmaprmap.而first'second'只是同firstsecond.同样,每个人ArrowChoice也都是Choice.

与箭相比,影响者缺乏的是构成它们的能力.如果我们添加构图,我们会得到一个箭头吗?换句话说,如果(强)profunctor也是一个类别,它是否已经是一个箭头?如果没有,有什么遗漏?

haskell arrows functor category-theory profunctor

22
推荐指数
2
解决办法
2446
查看次数

Haskell单身人士:我们用SNat获得了什么

我正在努力培养Haskell单身人士.

在论文Dependently Typed Programming with Singletons 和他的博客文章中,单例v0.9发布了! Richard Eisenberg定义了数据类型Nat,它用peano公理定义了自然数:

data Nat = Zero | Succ Nat
Run Code Online (Sandbox Code Playgroud)

通过使用语言扩展DataKinds,此数据类型将提升为类型级别.数据构造器ZeroSucc被提升为类型构造函数的Zero'Succ.有了这个,我们得到每个自然数在类型级别上的单个和唯一对应类型.例如3我们得到'Succ('Succ('Succ'Zero)).所以我们现在有自然数字作为类型.

然后,他在值级别上定义函数plus,在类型级别上定义类型族Plus 以使可用的加法操作.通过单例库的提升功能/准分析器,我们可以从plus功能自动创建Plus类型系列.所以我们可以避免写自己的类型家庭.

到现在为止还挺好!

使用GADT语法,他还定义了一个数据类型SNat:

data SNat :: Nat -> * where
  SZero :: SNat Zero
  SSucc :: SNat n -> SNat (Succ n)
Run Code Online (Sandbox Code Playgroud)

基本上他只将Nat类型包装成SNat构造函数.为什么这有必要?我们获得了什么?NatSNat的数据类型是不同构的吗?为什么SNat是单身人士,为什么 …

haskell dependent-type type-level-computation singleton-type

22
推荐指数
1
解决办法
1578
查看次数

Ed Kmett的递归方案包中的Fix,Mu和Nu有什么区别

在Ed Kmett的recursion-scheme包中,有三个声明:

newtype Fix f = Fix (f (Fix f))

newtype Mu f = Mu (forall a. (f a -> a) -> a)

data Nu f where 
  Nu :: (a -> f a) -> a -> Nu f
Run Code Online (Sandbox Code Playgroud)

这三种数据类型有什么区别?

haskell recursive-datastructures recursion-schemes fixpoint-combinators

22
推荐指数
1
解决办法
2120
查看次数

使用foldr实现zip

我目前正在使用Real World Haskell的第4章,我正试图围绕foldr实现foldl.

(这是他们的代码:)

myFoldl :: (a -> b -> a) -> a -> [b] -> a

myFoldl f z xs = foldr step id xs z
    where step x g a = g (f a x)
Run Code Online (Sandbox Code Playgroud)

我以为我会尝试zip使用相同的技术实现,但我似乎没有取得任何进展.它甚至可能吗?

haskell functional-programming combinators fold

20
推荐指数
5
解决办法
4250
查看次数

为什么这个版本的'fix'在Haskell中更有效?

在Haskell中,这是一个固定点的简单(天真)定义

fix :: (a -> a) -> a
fix f = f (fix f)
Run Code Online (Sandbox Code Playgroud)

但是,这是Haskell实际实现它的方式(效率更高)

fix f = let x = f x in x
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么第二个比第一个更有效?

haskell fixpoint-combinators

19
推荐指数
3
解决办法
1129
查看次数

自己定义严格的应用程序($!)并不会产生相同的性能

我最近正在阅读Michael Snoyman撰写的这篇博客文章.在那里建议的练习中,我试图自己定义$!运算符:

import Prelude hiding ( ($!) )

($!) :: (a -> b) -> a -> b
($!) f x = x `seq` f x

mysum :: [Int] -> Int
mysum list0 =
  go list0 0
  where
    go [] total = total
    go (x:xs) total = go xs $! total + x

main = print $ mysum [1..1000000]
Run Code Online (Sandbox Code Playgroud)

虽然记忆的使用很糟糕,但我认为这种方法效果很好.我的第一个问题是这个.为什么这不好用?

然后,我在Prelude中检查了它的定义.它写道:

($!)                    :: (a -> b) -> a -> b
f $! x                  = let !vx = …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

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

Haskell:修复或不修复

我最近了解到Data.Function.fix,现在我想在任何地方应用它.例如,每当我看到递归函数时,我想" fix"它.所以基本上我的问题是我应该在何时何地使用它.

为了使它更具体:

1)假设我有以下代码用于分解n:

f n = f' n primes
  where
    f' n (p:ps) = ...
    -- if p^2<=n: returns (p,k):f' (n `div` p^k) ps for k = maximum power of p in n
    -- if n<=1: returns []
    -- otherwise: returns [(n,1)]
Run Code Online (Sandbox Code Playgroud)

如果我改写它fix,我会获得一些东西吗?失去什么?有可能,通过重写一个显式的递归到fix-version我会解决,反之亦然会创建一个堆栈溢出?

2)处理列表时,有几种解决方案:递归/修复,foldr/foldl/foldl',可能还有别的东西.关于何时使用每种方法,是否有任何一般指导/建议?例如,您是否会使用foldr无限的素数列表重写上面的代码?

可能还有其他重要问题没有在这里讨论.欢迎任何与使用相关的其他评论fix.

haskell fixpoint-combinators

18
推荐指数
2
解决办法
875
查看次数

如何在Linux上安装2018年的Haskell(平台或堆栈)?

我试图从MiranLipovača 的书" 了解你的哈斯克尔 "一书中学习Haskell.本书和haskell.org都建议安装Haskell平台,但我没有下载Manjaro Linux(基于Arch).

我从2014年开始找到这个指南,并决定从Manjaro的存储库安装这些软件包.这很好用,直到我想在Emacs中使用haskell-mode.我对此进行了故障排除,发现它是包的问题(主要是Stack).

寻找解决方法,我找到了这个Reddit线程,它描述了安装Haskell(不是平台)的方法,以及包的问题.我跟着一个评论,并结束了与脚本安装堆栈(GHC和)的描述在这里:

wget -qO- https://get.haskellstack.org/ | sh
stack setup
stack update
Run Code Online (Sandbox Code Playgroud)

我的问题与此有关:

  1. 这是2018年在Linux(Manjaro)上安装正常运行的Haskell(平台)的推荐方法吗?如果不是:这样做的方式是什么?
  2. Haskell平台包含:GHC,Cabal,Stack和一些包.安装了GHC和Stack,如何通过Stack安装Cabal?
  3. 我是否需要Cabal(堆栈似乎有重叠的功能)?
  4. 看看Haskell平台的软件包,如上所述安装Stack会丢失什么,如果有的话?看$HOME/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.2.2/lib/ghc-8.2.2其中许多似乎已经安装.

linux haskell cabal haskell-platform haskell-stack

18
推荐指数
2
解决办法
7045
查看次数