考虑以下签名 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,Monoid和Monad,但在超我找不到它.据推测,我可以将其中的一个或两个转换为另一个,但我不确定如何.
这种关系可以详细说明吗?
我想了解如何使用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单身人士.
在论文Dependently Typed Programming with Singletons 和他的博客文章中,单例v0.9发布了! Richard Eisenberg定义了数据类型Nat,它用peano公理定义了自然数:
data Nat = Zero | Succ Nat
Run Code Online (Sandbox Code Playgroud)
通过使用语言扩展DataKinds,此数据类型将提升为类型级别.数据构造器Zero和Succ被提升为类型构造函数的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构造函数.为什么这有必要?我们获得了什么?Nat和SNat的数据类型是不同构的吗?为什么SNat是单身人士,为什么 …
haskell dependent-type type-level-computation singleton-type
在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
我目前正在使用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中,这是一个固定点的简单(天真)定义
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)
我的问题是为什么第二个比第一个更有效?
我最近正在阅读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) 我最近了解到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.
我试图从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)
我的问题与此有关:
$HOME/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.2.2/lib/ghc-8.2.2其中许多似乎已经安装.haskell ×10
arrows ×1
cabal ×1
combinators ×1
fold ×1
foldable ×1
functor ×1
ghc ×1
linux ×1
profunctor ×1