这些天有很多关于单子的讨论.我已经阅读了一些文章/博客文章,但我不能用他们的例子来完全掌握这个概念.原因是monad是一个函数式语言概念,因此这些例子都是我没有使用过的语言(因为我没有深入使用过函数式语言).我无法深入掌握语法以完全遵循这些文章......但我可以告诉它有一些值得理解的东西.
但是,我非常了解C#,包括lambda表达式和其他功能特性.我知道C#只有一部分功能特性,所以monad不能用C#表示.
但是,肯定有可能传达这个概念吗?至少我希望如此.也许您可以将C#示例作为基础,然后描述C#开发人员希望他可以从那里做什么,但不能,因为该语言缺乏函数式编程功能.这太棒了,因为它会传达monad的意图和好处.所以这就是我的问题:你可以给一个C#3开发人员提供monad的最佳解释是什么?
谢谢!
(编辑:顺便说一下,我知道SO上至少有3个"什么是monad"问题.然而,我遇到了同样的问题......所以这个问题需要imo,因为C#-developer焦点.谢谢.)
您能否请C++开发人员详细介绍RAII是什么,为什么重要,以及它是否与其他语言有任何关联?
我做知道一点点.我相信它代表"资源获取是初始化".但是,这个名称并不符合我对RAII的理解(可能不正确):我得到的印象是RAII是一种初始化堆栈中对象的方式,当这些变量超出范围时,析构函数会自动被称为导致资源被清理.
那么为什么不称为"使用堆栈触发清理"(UTSTTC :)?你怎么从那里到"RAII"?
你怎么能在堆栈上创建一些东西来清理堆上的东西呢?此外,是否有不能使用RAII的情况?你有没有发现自己希望收集垃圾?至少一个垃圾收集器,你可以使用一些对象,同时让其他人管理?
谢谢.
功能语言导致使用递归来解决许多问题,因此许多函数执行尾调用优化(TCO).TCO导致从另一个函数调用函数(或者本身,在这种情况下,这个特性也称为Tail Recursion Elimination,它是TCO的一个子集),作为该函数的最后一步,不需要新的堆栈帧,这减少了开销和内存使用.
Ruby显然已经从函数式语言(lambdas,map等函数等)中"借用"了许多概念,这让我很好奇:Ruby是否执行尾调用优化?
我是Haskell的新手,面对一个我无法理解的"无法构造无限类型"的错误.
事实上,除此之外,我还没有找到这个错误甚至意味着什么的好解释,所以如果你能超越我的基本问题并解释"无限类型"错误,我真的很感激.
这是代码:
intersperse :: a -> [[a]] -> [a]
-- intersperse '*' ["foo","bar","baz","quux"]
-- should produce the following:
-- "foo*bar*baz*quux"
-- intersperse -99 [ [1,2,3],[4,5,6],[7,8,9]]
-- should produce the following:
-- [1,2,3,-99,4,5,6,-99,7,8,9]
intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:y:xs) = x:s:y:intersperse s xs
Run Code Online (Sandbox Code Playgroud)
这是尝试将其加载到解释器中的错误:
Prelude> :load ./chapter.3.ending.real.world.haskell.exercises.hs
[1 of 1] Compiling Main (chapter.3.ending.real.world.haskell.exercises.hs, interpreted )
chapter.3.ending.real.world.haskell.exercises.hs:147:0:
Occurs check: cannot construct the infinite type: a = [a]
When generalising the type(s) for `intersperse'
Failed, …Run Code Online (Sandbox Code Playgroud) 有几次,我遇到过这样的说法:如果你将一个函数从一个文件移动到另一个文件,Git可以跟踪它.例如,这个条目说,"Linus说,如果你将一个函数从一个文件移动到另一个文件,Git会告诉你整个移动过程中单个函数的历史."
但我对Git的一些引擎盖设计有一点了解,我不知道这是怎么回事.所以我想知道......这是正确的陈述吗?如果是这样,这怎么可能?
我的理解是Git将每个文件的内容存储为Blob,每个Blob都有一个全局唯一的标识,该标识来自其内容和大小的SHA哈希.然后Git将文件夹表示为树.任何文件名信息都属于Tree,而不属于Blob,因此文件重命名例如显示为对Tree的更改,而不是Blob.
因此,如果我有一个名为"foo"的文件,其中包含20个函数,以及一个名为"bar"的文件,其中包含5个函数,我将其中一个函数从foo移动到bar(分别生成19和6), Git如何检测到我将该函数从一个文件移动到另一个文件?
根据我的理解,这将导致2个新的blob存在(一个用于修改的foo,一个用于修改的条).我意识到可以计算diff以显示函数从一个文件移动到另一个文件.但是我没有看到关于函数的历史如何可能与bar而不是foo相关联(反正不是自动的).
如果Git的是真正看里面单个的文件,并计算每个函数BLOB(这将是疯狂的/不可行的,因为你必须知道如何解析任何可能的语言),那么我可以看到这是可能的.
所以...声明是否正确?如果它是正确的,那么我理解中缺少什么?
当我第一次输入这个问题时,我这样做是为了找到重复的问题,确信有人必须已经问过这个问题.我的计划是遵循这些欺骗链接而不是发布此问题.但据我所知,这个问题以前没有被问过......它没有出现在"相关问题"列表中.
为了深入了解C#中的表达式树,你找到了哪些最好的资源(文章,书籍,博客文章等)? 我一直对他们的能力感到惊讶,现在我正处在我说的地方,"好吧,足够的惊喜.我现在想停下来获得这些东西的博士学位." 我正在寻找系统,有条理地涵盖功能的材料,然后详细介绍了如何使用它们.
注意:我不是在谈论lambda表达式.我在谈论Expression <T>以及随之而来的所有事情.
谢谢.
"派对模型"是关系数据库设计的"模式".至少部分涉及在诸如Customer,Employee,Partner等许多实体之间寻找共性,并将其分解为一些更"抽象"的数据库表.
我想了解您对以下内容的看法:
我确信每一个回复都不会解决所有这些问题......但任何涉及其中一个或多个的问题都会帮助我做出一些我正面临的决定.
谢谢.
我有一些Haskell代码是不会无限名单上正常工作,但我不明白为什么它可以做得很成功.(我修改了我原来的代码 - 没有处理无限列表 - 在网上加入其他代码的东西,突然间我发现它有效,但不知道为什么).
myAny :: (a -> Bool) -> [a] -> Bool
myAny p list = foldr step False list
where
step item acc = p item || acc
Run Code Online (Sandbox Code Playgroud)
我对foldr的理解是它将遍历列表中的每个项目(也许这种理解是不完整的).如果是这样,那么"步"函数的表达方式无关紧要......代码应该无法处理无限循环.
但是,以下工作:
*Main Data.List> myAny even [1..]
True
Run Code Online (Sandbox Code Playgroud)
请帮我理解:为什么?
任何语言中的一个常见问题是断言发送到方法的参数满足您的要求,如果不满足,则发送好的,信息丰富的错误消息.这种代码反复重复,我们经常尝试为它创建帮助器.然而,在C#中,似乎那些帮助者被迫处理语言和编译器强加给我们的一些重复.为了表明我的意思,让我提供一些没有帮助的原始代码,然后是一个可能的帮助器.然后,我会指出帮助器中的重复并准确地说出我的问题.
首先,代码没有任何帮助:
public void SomeMethod(string firstName, string lastName, int age)
{
if(firstName == null)
{
throw new WhateverException("The value for firstName cannot be null.");
}
if(lastName == null)
{
throw new WhateverException("The value for lastName cannot be null.");
}
// Same kind of code for age, making sure it is a reasonable range (< 150, for example).
// You get the idea
}
Run Code Online (Sandbox Code Playgroud)
}
现在,代码合理地尝试帮助:
public void SomeMethod(string firstName, string lastName, int age)
{
Helper.Validate( x=> x !=null, "firstName", firstName); …Run Code Online (Sandbox Code Playgroud) 根据我在StackOverflow上发现的一些建议,我正在深入研究Haskell.我很高兴看到Haskell的参数化类型与C#泛型非常相似.两种语言都建议使用单个字母作为类型参数(通常),并且两种语言似乎都遵循类似的过程来将实际类型替换为类型参数.因此,我很快就理解了这个概念.
这导致了这一点:Haskell的参数化类型与C#泛型类型的不同之处是什么?我从学习Ruby中了解到,您可能会遇到大麻烦,认为您熟悉的一种语言在您熟悉的另一种语言中是相同的.通常情况下,麻烦更糟糕的是,当功能其实是非常相似......因为它们通常不是 100%相同.那么,如果我假设我根据自己对C#泛型的了解理解参数化类型,那么我可能会被一些"陷阱"淹没?
谢谢.