例如,我想创建一个整数三元组的MyType类型.但不仅仅是三个整数的笛卡儿积,我希望该类型代表所有(x,y,z),使得x + y + z = 5
我怎么做?除了使用just(x,y),因为z = 5 - x - y
同样的问题,如果我有三个构造函数A,B,C和类型应该是所有(A x,B y,C z),使得x + y + z = 5
根据一些教程(包括Real World Haskell),可以使用ghci执行以下操作
ghci > :m Text.Regex.Posix
ghci > "foo foo foo" =~ "foo" :: [String]
["foo","foo","foo"]
Run Code Online (Sandbox Code Playgroud)
然而,当我尝试这个时,它会产生
No instance for (RegexContext Regex [Char] [String])
arising from a use of `=~'
Possible fix:
add an instance declaration for
(RegexContext Regex [Char] [String])
In the expression: "abc" =~ "ab" :: [String]
In an equation for `it': it = "abc" =~ "ab" :: [String]
Run Code Online (Sandbox Code Playgroud)
获取haskell中所有匹配列表的正确方法是什么?
我和一位同事讨论过,他坚持认为在Java和C#这样的语言中,没有任何理由使用Pure Abstract基类,因为它只是意味着你无法避免缺少多重继承.
我觉得他错了,因为我一直以为如果一个东西是名词那么它就是一个对象,如果它是一个动词那么它就是一个界面.
例如,如果我想定义类型Bird
,我想在fly
不实现它的情况下强制执行该方法,那么我将使它成为一个纯抽象类.
如果我想定义一个类型Flies
,我会把它作为该方法的接口fly
.
Bird
可能会实施Flies
.
我错了吗?
编辑:
我能给予支持我观点的唯一可靠论点是,在未来的某个时刻,设计可能需要改变,以便鸟类可以吃.如果所有的鸟都吃同样的东西,那么就需要添加Bird
它,使它成为非纯抽象的.
如果Bird
是一个接口,这个改变只会是一场噩梦,因为我不知道从其他基类继承的东西是否也实现了我的Bird
接口,所以我不能只重构我的问题.
我正在自学Haskell,我想知道以下类型的签名:
Prelude> :t ($)
($) :: (a -> b) -> a -> b
Prelude>
Run Code Online (Sandbox Code Playgroud)
我应该如何解释(没有双关语意)?
一个半相似的结果也证明是令人费解的:
Prelude> :t map
map :: (a -> b) -> [a] -> [b]
Prelude>
Run Code Online (Sandbox Code Playgroud) 为什么我不能setTimeout
在javascript对象中使用?
Message = function () {
...
...
this.messageFactory = ...
this.feedbackTag = document.getElementById('feedbackMessages');
this.addInfo = function (message) {
var info = this.messageFactory.createInfo(message); // create a div
this.feedbackTag.appendChild(info);
setTimeout('this.feedbackTag.removeChild(info)', 5000);
// why in here, it complain this.feedbacktag is undefined ??????
};
}
Run Code Online (Sandbox Code Playgroud)
感谢Steve的解决方案,现在如果代码如下所示它将起作用...因为之前'this'实际指向setTimeOut中的函数,它不能重新发送消息.
Message = function () {
...
...
this.messageFactory = ...
this.feedbackTag = document.getElementById('feedbackMessages');
this.addInfo = function (message) {
var info = this.messageFactory.createInfo(message); // create a div
this.feedbackTag.appendChild(info);
var _this = this;
setTimeout(function() { _this.feedbackTag.removeChild(info); }, …
Run Code Online (Sandbox Code Playgroud) 这是一个我一直想知道的问题.如果语句是大多数编程语言中的主要语言(至少是我曾经使用过的语句),但在Haskell中,它似乎很不受欢迎.我理解,对于复杂情况,Haskell的模式匹配比一堆ifs更清晰,但是有什么真正的区别吗?
举一个简单的例子,拿一个自制版本的总和(是的,我知道它可能只是foldr (+) 0
):
sum :: [Int] -> Int
-- separate all the cases out
sum [] = 0
sum (x:xs) = x + sum xs
-- guards
sum xs
| null xs = 0
| otherwise = (head xs) + sum (tail xs)
-- case
sum xs = case xs of
[] -> 0
_ -> (head xs) + sum (tail xs)
-- if statement
sum xs = if null xs then 0 else (head xs) + …
Run Code Online (Sandbox Code Playgroud) 你能为C推荐一个好的通用数据容器库(纯C,而不是C++)吗?我只需要基本结构,如动态数组,哈希表等.
(注意:"好"我的意思是快速+优雅的界面).
我有这个代码的问题,它应该计算字符串中相同字母的最长子字符串,但是有一个错误:
*** Exception: test.hs:(15,0)-(21,17):
Non-exhaustive patterns in function countLongest'
Run Code Online (Sandbox Code Playgroud)
我知道这是错误的类型问题,但我不知道错误在哪里,或者如何查找或调试它
countLongest :: (Eq a) => [a] -> Int
countLongest' :: (Eq a) => Int -> Int -> [a] -> Int
countLongest a = countLongest' 0 0 a
countLongest' n max (y:x:ys)
| y == x = countLongest' (n+1) max (x:ys)
| n > max = countLongest' 0 (n) (x:ys)
| otherwise = countLongest' 0 (max) (x:ys)
countLongest' n max []
| n > max = n
| otherwise = max
Run Code Online (Sandbox Code Playgroud) 我需要合并两个分支 - second
进入first
然后摆脱second
.这是我做的:
git clone
d项目获得新的副本git checkout --track origin/second
,做了一些改变,并承诺git checkout --track origin/first
,做了一些改变,并承诺git merge second
(git说"通过递归合并")git branch -d second
然后git说:
$ git branch -d second
warning: not deleting branch 'second' that is not yet merged to
'refs/remotes/origin/second', even though it is merged to HEAD.
error: The branch 'second' is not fully merged.
If you are sure you want to delete it, run 'git branch -D second'.
Run Code Online (Sandbox Code Playgroud)
为什么会这样?合并之前我从未收到此消息.合并工作得很好,没有冲突.如何安全删除second
分支?