小编Mat*_*hid的帖子

"你不明白欣德利 - 米尔纳的哪一部分?"

发誓曾经有一件T恤出售,上面写着不朽的话:


什么部分

辛德米尔纳

明白吗?


就我而言,答案就是......全部!

特别是,我经常在Haskell论文中看到这样的符号,但我不知道它的含义是什么.我不知道它应该是什么样的数学分支.

我当然认识到希腊字母的字母,以及诸如"∉"之类的符号(通常意味着某些东西不是一组的元素).

另一方面,我以前从未见过"⊢"(维基百科称它可能意味着"分区").我也不熟悉这里使用的vinculum.(通常它表示一个级分,但是这并不出现在这里是这种情况.)

如果有人至少可以告诉我从哪里开始想要理解这个符号海洋的含义,那将会有所帮助.

haskell functional-programming lambda-calculus hindley-milner denotational-semantics

832
推荐指数
6
解决办法
9万
查看次数

为什么不依赖键入?

我看到几个消息来源反映了"Haskell逐渐成为一种依赖型语言"的观点.暗示似乎是随着越来越多的语言扩展,Haskell正朝着这个方向漂移,但还没有.

基本上我想知道两件事.首先,很简单,"作为一种依赖型语言"究竟意味着什么?(希望没有太过技术性.)

第二个问题是......有什么缺点?我的意思是,人们知道我们正朝着这个方向前进,所以必须有一些优势.然而,我们还没有,所以必须有一些下行阻止人们一路走下去.我的印象是问题是复杂性急剧增加.但是,并不是真正了解依赖打字是什么,我不确定.

知道的是,每次我开始阅读一种依赖类型的编程语言时,文本都是完全不可理解的......大概这就是问题所在.(?)

haskell type-systems dependent-type

159
推荐指数
4
解决办法
1万
查看次数

与时间一起工作,而不是一天中的时间

我正在做一些基准测试,我想用Excel来生成结果图.我有一个简单但烦人的问题,就是烤我的面条.

问题是Excel 坚持认为"时间"意味着一天中的某个时间.它拒绝让我使用持续时间.当我试着说"三分六秒"时,它误解为" 午夜三分六秒",这根本不是我的意思.

我可以通过费力地将所有内容转换为秒来解决问题.但是我的所有图表都会在几秒钟内完成,而不是分钟和秒.此外,必须继续打字=3*60+6而不仅仅是公关是一件痛苦的事3:06.一旦我完成它,我必须查看公式,以检查我是否正确输入数据[并没有搞砸公式].

有谁知道我怎样才能使Excel,将按时上班时间不固定,以一天中的特定时间?

excel

85
推荐指数
4
解决办法
22万
查看次数

什么是超级编译?

简短而甜蜜:我见过几个谈论"超级编译"的消息来源.但是,我还没有在互联网的任何地方找到一个单独的文件来描述这是什么.大概是因为对于那些甚至不值得解释的人来说似乎很简单.

有人知道这究竟是什么吗?

haskell compilation

69
推荐指数
1
解决办法
8148
查看次数

Pause monad

Monads可以做许多惊人的,疯狂的事情.他们可以创建具有值叠加的变量.它们可以允许您在计算之前访问未来的数据.它们可以让您编写破坏性更新,但不是真的.然后延续monad让你打破人们的思想!通常是你自己的.;-)

但这是一个挑战:你能制作一个可以暂停的单子吗?

data Pause s x
instance Monad (Pause s)
mutate :: (s -> s) -> Pause s ()
yield :: Pause s ()
step :: s -> Pause s () -> (s, Maybe (Pause s ()))

Pause单子是一种状态的单子(因此mutate,具有明显的语义).通常情况下,像这样的monad具有某种"运行"功能,它运行计算并将您送回最终状态.但Pause它是不同的:它提供了一个step函数,它运行计算直到它调用魔法yield函数.这里计算暂停,返回给调用者足够的信息以便稍后恢复计算.

额外的awesomne​​ss:允许调用者修改step调用之间的状态.(例如,上面的类型签名应该允许这样做.)


使用案例:编写执行复杂操作的代码通常很容易,但是要将其转换为也在其操作中输出中间状态的总PITA .如果您希望用户能够在执行过程中途改变某些内容,那么事情变得非常复杂.

实施思路:

  • 显然它可以用线程,锁和IO.但我们能做得更好吗?;-)

  • 继续monad疯狂的东西?

  • 也许是某种编写器monad,yield只记录当前状态,然后我们可以step通过迭代日志中的状态来"假装" 它.(显然这排除了改变步骤之间的状态,因为我们现在并没有真正"暂停"任何东西.)

monads haskell coroutine monad-transformers free-monad

64
推荐指数
6
解决办法
5407
查看次数

什么构成除列表以外的类型的折叠?

考虑一个单链表.它看起来像

data List x = Node x (List x) | End
Run Code Online (Sandbox Code Playgroud)

定义折叠函数是很自然的

reduce :: (x -> y -> y) -> y -> List x -> y
Run Code Online (Sandbox Code Playgroud)

从某种意义上说,reduce f x0替代每一个Nodef一位Endx0.这就是Prelude所说的折叠.

现在考虑一个简单的二叉树:

data Tree x = Leaf x | Branch (Tree x) (Tree x)
Run Code Online (Sandbox Code Playgroud)

定义诸如的函数同样很自然

reduce :: (y -> y -> y) -> (x -> y) -> Tree x -> y
Run Code Online (Sandbox Code Playgroud)

请注意,这种减少具有完全不同的特征; 而基于列表的一个本质上是顺序的,这个新的基于树的一个具有更多的分而治之的感觉.你甚至可以想象par在那里扔几个组合器.(你会在列表版本中放置这样的东西?)

我的问题:这个功能是否仍被归类为"折叠",还是其他东西?(如果是的话,它是什么?)

基本上每当有人谈论折叠时,他们总是谈论折叠列表 …

haskell functional-programming terminology fold

64
推荐指数
4
解决办法
8203
查看次数

使用Join()而不是Bind()的Monads

Monad通常用return和来解释bind.不过,我猜想你也可以实现bind在以下方面join(和fmap?)

在缺乏一流功能的编程语言中,使用起来bind非常难以捉摸.join另一方面,看起来很容易.

但是,我并不完全确定我理解它是如何join运作的.显然,它有[Haskell]类型

join :: Monad m => m (m x) -> m x

对于monad列表,这显然很简单concat.但是对于一般的monad来说,这种方法在操作上实际上做了什么?我看到它对类型签名的作用,但我试图弄清楚我是如何在Java或类似的东西中写出这样的东西.

(实际上,这很容易:我不会.因为仿制药已经坏了.;-)但原则问题仍然存在......)


哎呀.看起来之前有人问过:

Monad加入功能

可能有人勾画出使用普通的单子一些实现return,fmapjoin?(即,根本没有提到>>=.)我想也许这可能有助于它沉入我愚蠢的大脑......

monads haskell

62
推荐指数
6
解决办法
1万
查看次数

编写GNOME Shell扩展的文档

我被要求自定义GNOME 3桌面的布局.显然,这样做的方法是写一个"扩展".

我已经成功完成了一些我想做的事情,但我完全缺乏信息.我无法找到任何有用的文档的任何地方.我浪费了生命中的一整天疯狂地搜索每一个可以想象的搜索词,以寻求有用的信息.

GNOME网站有数百个下载扩展.这些不是简单的3线; 它们是复杂的代码片段.它无法相信任何人都可以在没有文件解释如何做的情况下编写这些内容.

请问,有人能告诉我实际文件在哪里吗?到目前为止,我设法做的最好的事情是拆开现有的扩展程序,试图找到执行我感兴趣的特定位的魔术命令.(这不是一件容易的事!)

命令名称,对象路径,示例程序,任何东西都会有所帮助!

gnome-shell-extensions

61
推荐指数
2
解决办法
1万
查看次数

为什么seq不好?

Haskell有一个神奇的函数命名seq,它接受任何类型的参数并将其简化为弱头范式(WHNF).

我读过几个消息来源[不是我记得他们现在是谁...],声称"多态seq是坏的".他们以什么方式"坏"?

类似地,有一个rnf函数,它减少了Normal Form(NF)的参数.但是,是一个类的方法; 它不适用于任意类型.对我来说似乎"显而易见",人们可以改变语言规范,将其作为内置原语提供,类似于seq.据推测,这可能比仅仅更糟糕seq.这是怎么回事?

最后,有人建议给seq,rnf,par和同类者同类型的id功能,而不是const功能,因为它是现在,会是一个进步.怎么会这样?

haskell lazy-evaluation

57
推荐指数
2
解决办法
1万
查看次数

库里 - 霍华德同构

我在互联网上搜索过,我找不到任何关于CHI的解释,这些解释不会迅速退化为逻辑理论的讲座,而这个讲座已经在我脑海中浮现.(这些人说话就好像"直觉主义命题演算"这个短语实际上对正常人来说意味着什么!)

粗略地说,CHI说类型是定理,程序是那些定理的证明.但到底是什么意思呢

到目前为止,我已经想到了这一点:

  • 考虑id :: x -> x.它的类型说"鉴于X是真的,我们可以断定X是真的".对我来说似乎是一个合理的定理.

  • 现在考虑foo :: x -> y.正如任何Haskell程序员都会告诉你的那样,这是不可能的.你不能写这个功能.(好吧,无论如何都没有作弊.)作为一个定理,它说"假设任何X都是真的,我们可以得出结论,任何Y都是真的".这显然是胡说八道.而且,果然,你不能写这个功能.

  • 更一般地,函数的参数可以被认为是"假设为真的",并且结果类型可以被认为是"假设所有其他事物都是真的".如果有一个函数参数,比如说x -> y,我们可以假设X为真意味着Y必须为真.

  • 例如,(.) :: (y -> z) -> (x -> y) -> x -> z可以假设"假设Y暗示Z,X暗示Y,并且X为真,我们可以断定Z为真".这对我来说在逻辑上是合理的.

现在,到底是什么Int -> Int意思?O_O

我能想出的唯一明智的答案是:如果你有一个函数X - > Y - > Z,那么类型签名会说"假设可以构造一个X类型的值,另一个类型为Y,那么可以构造Z"类型的值.函数体将准确描述您将如何执行此操作.

这似乎有道理,但它不是很有趣.显然,它必须比这更多......

logic haskell types curry-howard

49
推荐指数
1
解决办法
7789
查看次数