下个月,我将参与一个新的研发项目,该项目将采用函数式编程语言(我投票支持Haskell,但现在F#得到了更多的共识).现在,我已经使用过这些语言一段时间了,并用它们开发了一些命令行工具,但这是一个非常大的项目,我正在努力提高我的函数式编程知识和技术.我也阅读了很多关于这个主题的内容,但是我找不到任何记录功能编程领域反模式的书籍或资源.
现在,了解反模式意味着要了解其他聪明人的失败:在OOP中我知道其中的一些,而且我有足够的经验可以明智地选择通常是反模式的东西,完全符合我的需要.但我可以选择这个,因为我知道其他聪明人所吸取的教训.
因此,我的问题是:函数式编程中是否有任何记录的 反模式?直到现在,我的所有同事告诉我他们不知道,但他们不能说明原因.
请 不要在列表中转换这个问题:这是一个布尔问题,只需要一个证明来评估答案.例如,如果你是Oleg Kiselyov,"是"就足够了,因为每个人都能找到你关于这个主题的文章.不过,请慷慨.
请注意,我正在寻找正式的反模式,而不是简单的坏习惯或不良做法.
...... 必须至少有两个关键要素才能正式区分实际的反模式和简单的坏习惯,不良做法或坏主意:
- 一些重复的行动模式,过程或结构最初似乎是有益的,但最终会产生比有益结果更糟糕的后果,并且
- 存在一种明确记录的替代解决方案,在实际操作中得到证实并且可重复.
此外,通过"记录",我的意思是来自权威作者或众所周知的来源.
我习惯的语言是:
但我也可以调整其他功能语言中记录的反模式知识.
我在网上搜索了很多,但我发现的所有资源都与OOP或函数布局相关(在函数开头定义变量等等).
在Vagrant设置中,我必须在配置阶段将几个文件从主机上传到guest虚拟机.
在https://docs.vagrantup.com/v2/provisioning/file.html中,我可以看到如何从源到目的地上传单个文件,但是如何上传多个文件或文件夹结构?
注意:我知道我可以使用shell配置程序执行此操作,但在这种特殊情况下,一组文件上载更合适.
这可能是一个非常愚蠢的问题,但我想知道为什么Rust编译器(用Rust编写)本身需要一个C++编译器.
我的意思是,从分发中预编译的Rust编译器应该就够了,不应该吗?
我有一个使用以下选项启动qemu的脚本:
qemu-system-x86_64 [...]
-net nic,model=rtl8139
-net user,hostfwd=tcp::5555-:1522
-net dump,file=/tmp/vm0.pcap
-redir tcp:9999::9
-redir tcp:17010::17010
-redir tcp:17013::17013
我想更新脚本以使用现代qemu选项。
我尝试使用以下参数,如手册页中所述
qemu-system-x86_64 [...]
-net nic,model=rtl8139
-net dump,file=/tmp/vm0.pcap
-net user,id=tcp1522,hostfwd=tcp::5555-:1522
-netdev user,id=tcp9,hostfwd=tcp::9999-:9
-netdev user,id=tcp17010,hostfwd=tcp::17010-:17010
-netdev user,id=tcp17013,hostfwd=tcp::17013-:17013
但是来宾无法再访问网络,主机也无法在转发的端口上访问该网络。
不推荐使用的-redir选项的确切含义是什么?
我对Azure价格计算器有点困惑。特别是它没有解释带宽定价。
我正在考虑将Azure用于一个宁静的api,它将使用blob来存储大多数数据,并将sql server数据库用于一个子集,该子集更容易通过关系方法进行管理。
在此应用程序中,大量数据将通过ReST api进入系统,但是一小部分将暴露给客户端(主要是摘要报告)。仍然需要的总带宽应为50 GiB / mo。
在与数据传输相关的Azure定价页面中,我看到定价仅与传出数据有关,但是我无法弄清楚这与将在Azure App Service中托管的ReST api有何关系。
我的意思是,这可能只是意味着我要为HTTPS响应(而不是HTTPS请求)所消耗的带宽付费,但是似乎很难估计这种定价。
尽管仔细阅读了相关的标准文档,但在open使用包含标志的系统调用调用系统调用时,我无法理解POSIX兼容系统中的预期行为O_CREAT|O_DIRECTORY.
该标准规定了
如果设置了O_CREAT和O_DIRECTORY 且请求的访问模式既不是O_WRONLY也不是O_RDWR,则结果未指定.
但是它没有指定既没有系统的行为(O_CREAT|O_DIRECTORY|O_WRONLY),也没有(O_CREAT|O_DIRECTORY|O_RDWR).确实(据我所知),行为EISDIR仅适用于现有目录.
在与O_CREATE相关的部分中,标准指定当命名文件不存在时,
如果未设置 O_DIRECTORY ,则应将文件创建为常规文件; [...]
但同样没有说明如果O_DIRECTORY设置也会发生什么.
我看两者的手册页NetBSD的(这臭名昭著非常关心的POSIX兼容)和Linux的(这是一种广泛使用的系统,尽管实际上不是POSIX一个),但我无法找到任何澄清.
说两个标志的使用是否未指定是否正确?如果是这样,最常见的行为是什么?
是否open(name, O_CREAT|O_DIRECTORY, mode) 相当于mkdir任何POSIX兼容的操作系统?
我很难写pipe这个签名:
toOneBigList :: (Monad m, Proxy p) => () -> Pipe p a [a] m r
Run Code Online (Sandbox Code Playgroud)
它应该简单地a从上游获取所有s并将它们发送到下游列表中.
我的所有尝试都从根本上被打破了.
任何人都能指出我正确的方向吗?
我有一个.NET窗口服务,应该从7:00开始,每天23:00停止,在后台连续运行.
虽然我可以对服务进行编码以使其在23到7之间休眠,但我更喜欢系统配置(类似于unix中的cron).
如何在Windows 7上执行此操作?
请注意,如果系统在7:00之后启动,则应立即启动该服务.
在Azure上的斑点微软的文档清楚地说明你有一个最大块大小(在每个块/附加/页BLOB块的最大数量),但它并没有提到任何下界。
假设您有大量的小型二进制Blob(从10到512字节),存储是在Blob数据所占用的确切磁盘空间上占的,还是有最小的块大小?还是已知的固定“每块”开销?
例如,是否可以创建一个10字节的块Blob?计费时实际占用了多少空间:10个字节或另一个最小数量(例如4k)?
是否存在这样的最小块大小,它如何应用于附加Blob?和页面斑点?
在x86_64上,我正在玩一个不支持多线程的玩具操作系统.
我尝试将两个全局寄存器变量关联到%gs和%fs,这样:
register Foo* foo asm("gs");
register Bar* bar asm("fs");
Run Code Online (Sandbox Code Playgroud)
但GCC抱怨"gs"和"fs"不是有效的注册名称.
我尝试了其他寄存器(例如r12和r15)并编译.我尝试使用%gs和%fs,编译错误仍然存在.
这种方式可以使用这些寄存器吗?
此外,我已经阅读了 amd64中这些寄存器的问题,但是我无法理解那里指出的问题:它是一个GCC错误还是在amd64中使用寄存器变量的问题?
azure ×2
c ×2
haskell ×2
.net ×1
assembly ×1
bsd ×1
cron ×1
f# ×1
filesystems ×1
gcc ×1
linux ×1
networking ×1
posix ×1
qemu ×1
rust ×1
scala ×1
vagrant ×1
vagrantfile ×1
virtualbox ×1
x86-64 ×1