设计/构建大型功能程序的好方法是什么,特别是在Haskell中?
我已经阅读了很多教程(自己写一个方案是我最喜欢的,真实世界Haskell紧随其后) - 但大多数程序都相对较小,而且是单一目的.另外,我不认为它们中的一些特别优雅(例如,WYAS中的大量查找表).
我现在想要编写更大的程序,包含更多移动部件 - 从各种不同来源获取数据,清理数据,以各种方式处理数据,在用户界面中显示,持久化,通过网络进行通信等.一个最好的结构,这样的代码是易读,可维护,适应不断变化的要求?
有大量文献针对大型面向对象的命令式程序解决这些问题.像MVC,设计模式等的想法是实现广泛目标的理想规定,例如在OO风格中分离关注点和可重用性.此外,较新的命令式语言适合于"随着您的成长而设计"的重构风格,在我的新手看来,Haskell似乎不太适合.
Haskell有相同的文献吗?如何在功能性编程(单子,箭头,应用等)中使用异域控制结构的动物园最好地用于此目的?你能推荐什么最佳实践?
谢谢!
编辑(这是Don Stewart回答的后续行动):
@dons提到:"Monads在类型中捕获关键的建筑设计."
我想我的问题是:如何在纯函数式语言中考虑关键的架构设计?
考虑几个数据流的示例和几个处理步骤.我可以将数据流的模块化解析器编写为一组数据结构,我可以将每个处理步骤实现为纯函数.一个数据所需的处理步骤将取决于其值和其他数据.一些步骤之后应该是GUI更新或数据库查询等副作用.
什么是以正确方式绑定数据和解析步骤的"正确"方法?人们可以编写一个大功能,为各种数据类型做正确的事情.或者可以使用monad来跟踪到目前为止已处理的内容,并让每个处理步骤从monad状态获得接下来需要的任何内容.或者可以写很多单独的程序并发送消息(我不太喜欢这个选项).
他链接的幻灯片有一个我们需要的东西子弹:"将设计映射到类型/函数/类/ monad上的成语".什么是成语?:)
我正在 Tomcat 6 上使用安全策略。我已成功向整个 Web 应用程序授予权限,但只想向特定类授予某些权限。但是,当我尝试这样做时,我的 doPrivileged 块收到 AccessControlException。
因为我已经成功授予了更通用的代码库,所以我回到了该代码库,并在添加每个附加子目录时进行了测试。通过这种方式,我能够提供的最具体的资助是:
grant codeBase "file:${catalina.home}/webapps/ROOT/WEB-INF/-" { ... }
如果我添加“classes/”,如下所示:
grant codeBase "file:${catalina.home}/webapps/ROOT/WEB-INF/classes/-" { ... }
然后我继续看到 AccessControlException。我试图允许的类位于类目录下。该 web 应用程序被部署为 .war 文件,并由 Tomcat 解压。
我在这里做错了什么?我打算遵循 Tomcat 提供的 catalina.policy 中提供的示例。
我正在开发一个人们会用阿拉伯语发表评论的网站.我的网站是用PHP构建的.有没有人知道如何添加从右到左的语言支持以用英语写文本?
我坚持下一步.如果有人可以帮助我,那将是很棒的:
2 = ?fx.f(f x)
3 = ?fx.f(f(f x))
ADD = ?m n f x. m f (n f x)
Run Code Online (Sandbox Code Playgroud)
我的步骤是:
(?m n f x. m f (n f x)) (?f x.f(f(f x))) (?f x.f(f x))
-> ((?n f x. (?f x.f(f(f x))) f (n f x))) (?f x.f(f x))
-> ((?f x. (?f' x'.f'(f'(f' x'))) f ((?f" x".f"(f" x")) f x)
Run Code Online (Sandbox Code Playgroud)
括号好吗?我真的对替换和括号感到困惑.是否有一种正式的,更容易解决此类问题的技术?
我正在 Android 设备上使用 Eclipse 进行开发。每次我想在设备上安装新版本的应用程序时,我需要连接它,启用 USB 调试,安装应用程序,禁用 USB 调试,拔下设备(可选)。我想知道在不禁用 USB 调试的情况下拔掉设备是否安全。毕竟设备没有挂载,对吧?但是有亚行,与它交谈。能够做到这一点会方便得多。有谁知道它是安全的还是不安全的?
我希望重新定义或更新模块中的一些绑定,然后由注入器使用.我意识到模块是不可变的,一旦绑定被吸入并注入其定义,就不能为所有实际目的而改变.
我想添加/更改/删除绑定,同时保持单身人士已经生活在注射器中.更改是一个简单的案例,因为可以通过使用提供程序来实现此效果.但是,动态添加或删除密钥(绑定定义)有点棘手.
任何想法,如果这应该或可以实际完成.
我认为最好的方法是每次添加/删除绑定时都重新创建一个注入器,将定义从原始复制到新的,任何现有的单例都将由toInstance重新定义,而不是实现类型等.
我终于在.NET 3.5/4.0框架中添加了所有新内容.最近几天我一直在使用CodeContracts,我真的很努力喜欢它们.我很好奇其他人对C#中CodeContracts的实现有何看法?具体来说,人们如何组织诸如接口的合同类,合同不变量的合同方法等等?
我喜欢合同提供的验证,乍一看它们看起来很棒.通过一些简单的行,我可以在运行代码之前获得一些很好的构建检查.不幸的是,我很难理解代码契约在C#中实现的方式,它们使我的代码比记录合同更加混乱.为了充分利用合同,我在假设和断言等方面乱丢我的代码(我知道有些人会说这是好事); 但正如我下面的一些例子所示,它将一条简单的行转换为4或5行,并且在我看来并没有真正增加其他方法(即断言,异常等)的足够价值.
目前,我最大的挫折是:
界面合同:
[ContractClass(typeof(IInterfaceContract))]
public interface IInterface
{
Object Method(Object arg);
}
[ContractClassFor(typeof(IInterface))]
internal abstract class IInterfaceContract
{
private IInterfaceContract() { }
Object IInterface.Method(Object arg)
{
Contract.Requires(arg != null);
Contract.Ensures(Contract.Result<Object>() != null);
return default(Object);
}
}
Run Code Online (Sandbox Code Playgroud)
这感觉就像这样一个cludge对我来说,我希望有一个更清洁的记录要求的方式,无论是通过属性或某种形式的内置的语言支持.我有这样的事实来实现,实现我的接口一个抽象类,只是让我可以指定合约似乎有些单调乏味的最好的.
代码膨胀:
typeof(Action<>).MakeGenericType(typeof(Object);
Run Code Online (Sandbox Code Playgroud)
需要几个假设才能验证现有的信息.我明白,所有的分析都知道的是,它是在型操作,因此必须在有限的知识工作,但它仍然让我很沮丧的是一个单一的代码行要求我重新写为
var genericAction = typeof(Action<>);
Contract.Assume(genericAction.IsGenericType);
Contract.Assume(genericAction.GetGenericArguments().Length == 1);
genericAction.MakeGenericType(typeof(Object));
Run Code Online (Sandbox Code Playgroud)
只是为了记录事情(是的,我知道我可以使用ContractVerificationAttribute来关闭方法/类等,或者使用SuppressMessageAttribbute来定位特定的消息,但这似乎打败了目的,因为你的代码很快就会被抑制等等所困扰.
另外,以案例为例
public class MyClass
: IInterface
{
private readonly Object _obj;
public Object Property
{
get
{
Contract.Ensures(Contract.Result<Object>() != null);
return _obj;
}
}
public MyClass(Object obj) …Run Code Online (Sandbox Code Playgroud) 我试图阻止Firefox中的一些文本突出显示,但不是页面上的所有元素.考虑以下:
<div style="-moz-user-select: none;">
I cannot be highlighted
<div style="-moz-user-select: text;">
I should be highlightable, but am not.
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
据我所知,使用上面的css规则,内部div的文本应该是可突出的.然而,这似乎不起作用.实际上,没有任何文本可以突出显示.
我想知道我做错了什么?如果没有,有没有人知道这种情况的解决方法?
谢谢!
ps我应该使用备用...
-webkit-user-select: none;
Run Code Online (Sandbox Code Playgroud)
...在上面的示例中,在webkit浏览器中运行良好
在PHP中使用__set访问器函数我可以设置标量的值,但不能设置数组的元素.即:
$p->scalavar = "Hello"; // This works fine
$p->myarray['title'] = "Hello"; //This does not work
Run Code Online (Sandbox Code Playgroud)
我的访问者如下:
function __set($mbr_name, $mbr_value) {
$this->$mbr_name = $mbr_value;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
有没有可以执行以下操作的软件?
给出一个英文句子
"他喜欢烤豆",
我将"他"改为"我",句子改为
"我喜欢烤豆"
(注意S)
要么
"她的头发扎成马尾辫"
我将"她"改为"他",句子改为
"他的头发扎成马尾辫".
同样,可以将句子改为过去时态,
"她的头发扎成马尾辫".
这样的软件是否存在?
php ×2
android ×1
arabic ×1
c# ×1
css ×1
firefox ×1
formatting ×1
guice ×1
haskell ×1
java ×1
javascript ×1
large-scale ×1
linguistics ×1
monads ×1
mutable ×1
security ×1
stylesheet ×1
tomcat ×1
tomcat6 ×1