我正在尝试为自己验证Haskell中的运算符和函数优先级.例如,以下代码
list = map foo $ xs
Run Code Online (Sandbox Code Playgroud)
可以改写为
list = (map foo) $ (xs)
Run Code Online (Sandbox Code Playgroud)
并最终将成为
list = map foo xs
Run Code Online (Sandbox Code Playgroud)
我的问题曾经是,为什么第一个表述不会被重写为
list = (map foo $) xs
Run Code Online (Sandbox Code Playgroud)
因为函数优先级总是高于运算符优先级,但我认为我找到了答案:运算符根本不允许作为函数的参数(当然,除非用括号括起它们).这是正确的吗?如果是这样的话,我觉得很奇怪,在RWH中没有提到这个机制/规则或者学习一个Haskell,或者我搜索过的任何其他地方.因此,如果您知道规则所在的地方,请链接到该地址.
- 编辑:感谢您的快速解答.我认为我的困惑来自于认为运算符字母会以某种方式评估某些东西,这可能会被函数作为参数使用.它帮助我记住,一个中缀运算符可以机械地转换为前缀函数.对第一个配方这样做会产生
($) (map foo) (xs)
Run Code Online (Sandbox Code Playgroud)
毫无疑问,($)是消耗函数,并且由于两个公式是等价的,因此第一个公式中的$ literal不能被map使用.
我目前正在研究ac #project,我需要访问Outlook.开发工作是在两台不同的机器上完成的,其中一台机器安装了办公室,另一台则没有.我之前曾询问如何针对outlook com对象编译我的项目,其中一条评论建议我针对办公室主互操作程序集或PIA进行编译.在我下载的Office 2007 PIA中,有一个msi文件,应该为Office的不同部分安装许多PIA.我的问题是,这似乎不会发生.打字后,在我办公室的机器上
msiexec /i o2007pia.msi
Run Code Online (Sandbox Code Playgroud)
在提示符下,Windows安装程序启动,并显示一个消息框,显示"请等待Windows配置Microsoft Office 2007主互操作程序集.收集所需信息"以及大约33%的进度条,之后它将消失,之后
gacutil -l microsoft.office.interop.outlook
Run Code Online (Sandbox Code Playgroud)
Office 2007没有产生任何结果(我得到一个结果,版本为10.0.4504.0,是早期安装尝试与Office版本错误的结果.但Office 2007 PIA具有主要版本12.)
我看到了几个可能的解释,其中没有一个我真的相信:
GAC无法处理同一程序集的多个版本,因此不允许我安装较新版本.
不知怎的,我不满足要求.这些基本上都是XPsp2,以及.Net 1.1或更高版本,我都有.要求部分还提到,下载适用于Office 2007,我没有安装,但我不认为这是一个要求.这既是因为没有被指定为要求,而且因为Hans Passant对我原来的问题的评论非常肯定PIA可以专门用于没有安装Office的开发,所以没有任何意义办公室作为先决条件.
那么有没有人知道为什么Office 2007 PIA没有正确安装,或者我能做些什么来接近答案?如果您需要更多信息,请告诉我.谢谢.
我的印象是,某个地方有一个实例,但我似乎无法找到它.我已经尝试导入Control.Monad,Control.Monad.Instances和Data.Either,如图所示
module Main where
import Control.Monad
import Data.Either
import Control.Monad.Instances
test :: [Either a b] -> Either a [b]
test = sequence
main = return ()
Run Code Online (Sandbox Code Playgroud)
但ghc告诉我它无法演绎(Monad(Either a)).添加
instance Monad (Either a) where
return = Right
Right b >>= f = f b
Left a >>= _ = Left a
Run Code Online (Sandbox Code Playgroud)
使代码编译,但是这个实例声明似乎很普遍,如果它在某些标准模块中还没有出现,那对我来说没有意义.如果是的话,我应该在哪里找到它,如果不是,那么有没有理由呢?
--------------编辑---------------
请注意,我现在认为下面的user31708的答案("从4.6开始,实例在Data.Either本身.")是目前正确的答案.我不确定在这种情况下重新分配所选答案的正确协议,其中所选答案是在提出问题时的正确答案,所以我保持原样.如果还有其他指导方针,请纠正我.
我正在Windows中制作一个小型Haskell游戏,我希望每次用户按下一个键时都会响应.因为getChar
奇怪的行为在Windows上,我用FFI以访问getch
中conio.h
,描述在这里.相关代码是:
foreign import ccall unsafe "conio.h getch" c_getch :: IO CInt
Run Code Online (Sandbox Code Playgroud)
当我在ghci中运行它或使用ghc编译它时,这很好.我也想尝试制作一个cabal包,所以从这个问题延伸,我在我的cabal文件中包含以下内容:
...
executable noughts
Includes: conio.h
Extra-libraries conio
...
Run Code Online (Sandbox Code Playgroud)
但是当我跑步时cabal configure
,它告诉我:
cabal: Missing dependency on a foreign library:
* Missing C library: conio
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为在我的haskell平台目录下...\Haskell Platform\2012.4.0.0\mingw
,目录下有一个conio.h
文件include
,但没有其他conio
文件提供目标代码.
我是以正确的方式做到这一点,如果是这样,我怎样才能找出要包含在我的cabal文件中的库?
作为我的Haskell学习过程的一部分,我喜欢明确地输出函数的类型声明.我希望能够为where子句中定义的函数执行此操作,但我不知道如何指定,where子句中的类型变量应该表示与外部类型声明中的某个类型变量相同的类型.例如,以下代码:
foo :: (a -> a) -> a -> a
foo f arg = bar arg
where
bar :: a -> a
bar a = f a
Run Code Online (Sandbox Code Playgroud)
产生此错误:
src\Test.hs:7:14:
Couldn't match expected type `a' against inferred type `a1'
`a' is a rigid type variable bound by
the type signature for `foo' at src\Test.hs:3:8
`a1' is a rigid type variable bound by
the type signature for `bar' at src\Test.hs:6:11
In the first argument of `f', namely `a'
In the expression: f …
Run Code Online (Sandbox Code Playgroud) 我有一个winform应用程序,一个可观察的设置如下:
Form form = new Form();
Label lb = new Label();
form.Controls.Add(lb);
Observable.Interval(TimeSpan.FromSeconds(1))
.Subscribe(l => lb.Text = l.ToString());
Application.Run(form);
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为l => lb.Text = l.ToString()
不会在创建表单的主线程上运行,但我无法弄清楚如何使它在此线程上运行.我想,我应该用IObservable.SubscribeOn
这需要一个或者IScheduler
或SynchronizationContext
,但我不知道如何让主线程的的SynchronizationContext,唯一的调度程序,我能找到人的静态属性Scheduler
,如Scheduler.CurrentThread
,Immediate
,NewThread
,TaskPool
和ThreadPool
,没有一个有效.
我的Rx版本是1.0.10621.
通过NUnit运行以下C#代码
Test.ControllerTest.TestSanity: Expected: `<System.DivideByZeroException>` But was: null
Run Code Online (Sandbox Code Playgroud)
因此要么不抛出DivideByZeroException,要么NUnit不捕获它.与这个问题类似,但他得到的答案,似乎并不适合我.这是使用NUnit 2.5.5.10112和.NET 4.0.30319.
[Test]
public void TestSanity()
{
Assert.Throws<DivideByZeroException>(new TestDelegate(() => DivideByZero()));
}
private void DivideByZero()
{
// Parse "0" to make sure to get an error at run time, not compile time.
var a = (1 / Double.Parse("0"));
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我想将文件设置为可供所有用户写入.
FileSecurity sec = File.GetAccessControl(fileName);
string users = ?????;
sec.AddAccessRule(new FileSystemAccessRule(
users,
FileSystemRights.Write,
AccessControlType.Allow));
File.SetAccessControl(fileName, sec);
Run Code Online (Sandbox Code Playgroud)
问题是我不知道要使用哪个字符串.我试过了users = WindowsAccountType.Normal.ToString()
,但这只是给出了,但是"Normal"
没有用.如何获取指定计算机上所有用户组的字符串?
我想知道Ord
实例声明(a,b)
,并且我想快速查找hackage以确认我的直觉,比较是第一次a
,然后,在相等的情况下,b
.我特意去了.由于hackage有链接到数据声明和函数的源代码,我假设还有实例声明的源代码,但我找不到它们.有没有理由说他们不在那里,或者我只是不够努力?type Answer = Either Explanation Directions
:)
在尝试验证自己时,对于IEnumerables的C#Equals是一个引用等于,我发现了一些奇怪的东西.在NUnit中进行以下设置
var a = (IEnumerable<string>)(new[] { "one", "two" });
var b = (IEnumerable<string>)(new[] { "one", "two" });
Run Code Online (Sandbox Code Playgroud)
这个测试
Assert.IsFalse(a.Equals(b));
Run Code Online (Sandbox Code Playgroud)
通过,而这个测试
Assert.AreNotEqual(a, b);
Run Code Online (Sandbox Code Playgroud)
没有.谁能解释为什么?
编辑:谢谢你的回答.我刚刚阅读了NUnit的文档,它说同样的事情,AreEqual和AreNotEqual with collections测试集合中每个元素的相等性.我想我坚持这个概念,AreEqual和AreNotEqual只是使用简单的Equals.