弱头范式 (WHNF)是什么意思? 头正常forms (HNF)和正常forms (NF)是什么意思? 真实世界哈斯克尔说: 熟悉的seq函数将expression式评估为我们称之为头标准forms(简称HNF)的expression式。 它一旦到达最外层的构造函数(“头”)就会停下来。 这不同于正常forms(NF),其中expression被完全评估。 你也会听到Haskell程序员提到弱头标准格式(WHNF)。 对于正常的数据,弱头标准forms与头标准forms相同。 function上的区别只在于,在这里关心我们是太深奥了。 我已经阅读了一些资源和定义( 哈斯克尔Wiki和哈斯克尔邮件列表和自由字典 ),但我不明白。 有人可以举一个例子或提供一个外行的定义? 我猜测它会类似于: WHNF = thunk : thunk HNF = 0 : thunk NF = 0 : 1 : 2 : 3 : [] seq和($!)与WHNF和HNF有什么关系? 更新 我仍然困惑。 我知道一些答案说忽略HNF。 从阅读各种定义看来,WHNF和HNF的正规数据似乎没有区别。 但是,它涉及到一个函数似乎有区别。 如果没有区别,为什么seq需要foldl' ? 另外一个混淆的地方是Haskell Wiki,它声明seq简化为WHNF,对于下面的例子什么也不做。 然后他们说他们必须使用seq来强制评估。 那不是强迫它到HNF? 常用的新手堆栈溢出代码: myAverage = uncurry (/) […]
我已经看到“ Free Monad”这个术语偶尔会出现一段时间,但是似乎每个人似乎都会使用/讨论它们,而没有给出它们的解释。 那么,什么是免费的单子呢? (我会说我熟悉单子和Haskell的基础知识,但对类别理论只有非常粗略的了解。)
在我看来,这个着名的问题是“什么是单子”? 特别是最被投票的人,试图解释什么是monad,却没有明确解释monad 为什么是必要的 。 他们可以解释为一个问题的解决scheme吗?
什么是一些使用Haskell的开源程序,可以被认为是高质量的现代Haskell ? 代码越大越好。 我想学习他们的源代码。 我觉得我已经从小代码的例子中学习了,这些例子往往是深奥的,小的世界。 我想看看代码是如何构造的,当有很多事情发生时(logging,I / O,configuration等)monad如何进行交互。
什么是索引monad和这个monad的动机? 我已经读过,它有助于跟踪副作用。 但型号签名和文件不会导致我到任何地方。 什么样的方式可以帮助跟踪副作用(或其他有效的例子)?
我想知道为什么:sprint报告xs = _在这种情况下: Prelude> xs = map (+1) [1..10] Prelude> length xs 10 Prelude> :sprint xs xs = _ 但不是在这种情况下: Prelude> xs = map (+1) [1..10] :: [Int] Prelude> length xs 10 Prelude> :sprint xs xs = [_,_,_,_,_,_,_,_,_,_] 注意:我用-XNoMonomorphismRestriction运行ghci 。 这是否与第一种情况下的xstypes是多态有关,而不是第二种情况呢? 我想知道内部发生了什么。
(.)需要两个函数,它们取一个值并返回一个值: (.) :: (b -> c) -> (a -> b) -> a -> c 由于(.)有两个参数,所以我觉得(.).(.)应该是无效的,但它是完全正确的: (.).(.) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c 这里发生了什么? 我意识到这个问题措辞严厉……所有的function都是由于咖喱而引起的。 也许更好的方式来说这是types不匹配。
是否有一个内置函数签名:: (Monad m) => ma -> a ? 霍格尔说,没有这样的function。 你能解释一下为什么?
我想用分析来编译我的程序,所以我运行: $ cabal configure –enable-executable-profiling … $ cabal build … Could not find module 'Graphics.UI.GLUT': Perhaps you havent installed the profiling libraries for package 'GLUT-2.2.2.0'? … $ # indeed I have not installed the prof libs for GLUT, so.. $ cabal install -p GLUT –reinstall … Could not find module 'Graphics.Rendering.OpenGL': Perhaps you havent installed […]
鉴于任何容器types,我们可以形成(以元素为中心的)拉链,并知道这个结构是一个Comonad。 这是最近探讨在另一个堆栈溢出问题的以下types的精彩细节: data Bin a = Branch (Bin a) a (Bin a) | Leaf a deriving Functor 用下面的拉链 data Dir = L | R data Step a = Step a Dir (Bin a) deriving Functor data Zip a = Zip [Step a] (Bin a) deriving Functor instance Comonad Zip where … Zip是一个Comonad虽然它的实例有点多毛。 也就是说, Zip可以从Tree完全机械地派生出来,并且(我相信)以这种方式派生的任何types都自动成为Comonad ,所以我觉得应该是这样的,我们可以一般地自动构造这些types和它们的连接器。 […]