我有一个使用的存储库,Travis CI在.travis.yml那里我有这一行:
script:
- vim -Nu <(cat <<-EOF
set nocompatible |
filetype off
EOF
) -c 'Script' > /dev/null
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这不起作用,因为它被转换为单行并执行如下:
vim -Nu <(cat <<-EOF set no compatible | filetype off | EOF ) -c 'Script' > /dev/null
Run Code Online (Sandbox Code Playgroud)
这使得EOF标签不起作用,因为EOF需要在一行中.另一种方法是使用这样的常规引号:
script:
- vim -Nu <(cat 'set nocompatible |
filetype off
) -c 'Script' > /dev/null
Run Code Online (Sandbox Code Playgroud)
哪个有效,并且很好,但我觉得必须有一种方法可以将换行符插入到.travis.yml.我现在有另一种选择,但将来我可能不会.你是怎么做到的?
在Ed Kmett的recursion-scheme包中,有三个声明:
newtype Fix f = Fix (f (Fix f))
newtype Mu f = Mu (forall a. (f a -> a) -> a)
data Nu f where
Nu :: (a -> f a) -> a -> Nu f
Run Code Online (Sandbox Code Playgroud)
这三种数据类型有什么区别?
haskell recursive-datastructures recursion-schemes fixpoint-combinators
我只是注意到它(<$>)的固定性infixl 4.怎么会这样?
(+1) <$> (/5) <$> [5,10] 显然从右到左.
我最近了解了GADTs他们和他们的符号:
例如
data Maybe a where
Nothing :: Maybe a
Just :: a -> Maybe a
data Either a b where
Left :: a -> Either a b
Right :: b -> Either a b
data Bool where
False :: Bool
True :: Bool
Run Code Online (Sandbox Code Playgroud)
现在,我注意到一个similiarity像功能bool,并且either,这基本上是一样的GADT定义:
Type -> (the letter of step 2)例如
maybe :: b -> (a -> b) -> Maybe a -> b
either :: (a -> …Run Code Online (Sandbox Code Playgroud) 人们通常将"不可修改的"与术语"文字"联系起来
char* str = "Hello World!";
*str = 'B'; // Bus Error!
Run Code Online (Sandbox Code Playgroud)
然而,当使用复合文字时,我很快发现它们是完全可修改的(并且锁定在生成的机器代码上,你会看到它们被推到堆栈上):
char* str = (char[]){"Hello World"};
*str = 'B'; // A-Okay!
Run Code Online (Sandbox Code Playgroud)
我正在编译clang-703.0.29.这两个例子不应该生成完全相同的机器代码吗?如果它是可修改的,复合文字真的是文字吗?
编辑:一个更短的例子是:
"Hello World"[0] = 'B'; // Bus Error!
(char[]){"Hello World"}[0] = 'B'; // Okay!
Run Code Online (Sandbox Code Playgroud) fmap也是<$>因为它是函数$类中的函数application().
(+5) $ (*10) $ 10 -- 105
(+5) <$> (*10) <$> [1,2,3] -- [15,25,35]
Run Code Online (Sandbox Code Playgroud)
然后我想,在这种情况下<*>,应用程序仿函数类别中的函数应用程序,这应该工作:
[(+5), (+10)] <*> [(*10), (*100)] <*> [1,2,3] -- ERROR
-- however:
[(+5), (+10)] <*> ([(*10), (*100)] <*> [1,2,3]) -- [15,25,35,...]
Run Code Online (Sandbox Code Playgroud)
因此,<$>只有因为fmap函数恰好是后期合成才会成功,因此(+5) <$> (*10)将(+5) . (*10)其应用于[1,2,3].
然而,对于所有应用程序运算符(<<=包括)而言,左边的关联性在我看来似乎是一个糟糕的设计选择,特别是在他们认识到$已经是正确关联的相似性之后.还有其他原因吗?
我有一个反向代理服务器,它根据主机头重定向到不同的服务.但是,使用浏览器向此服务器发出请求时,Host始终将其设置为URL中的域名.我试过了:
fetch("http://foo.com", {"headers":{"Host":"bar.foo.com"}})
Run Code Online (Sandbox Code Playgroud)
但它不起作用
我完全混淆了
newtype StateT s m a = StateT {runStateT :: s -> m (a, s)}
Run Code Online (Sandbox Code Playgroud)
和
type State s = StateT s Identity
Run Code Online (Sandbox Code Playgroud)
和
class Monad m => MonadState s m | m -> s
Run Code Online (Sandbox Code Playgroud) 我玩了显式构造函数及其行为,所以我创建了这个类:
#include <iostream>
class X
{
public:
explicit X(void)
{
std::cout << "Default constructor\n";
}
explicit X(X const& x)
{
std::cout << "Copy constructor\n";
}
explicit X(X&& x)
{
std::cout << "Move constructor\n";
}
};
Run Code Online (Sandbox Code Playgroud)
这基本上只是测试显式构造函数的存根.然后我想尝试几种情况.所以我尝试了这个:
X foo(void)
{
X a{};
return a; // ERROR: no matching constructor found!
}
int main()
{
X w{}; // Default Constructor
X x{w}; // Copy Constructor
X y{std::move(x)}; // Move Constructor
X z{foo()};
}
Run Code Online (Sandbox Code Playgroud)
你可以看到我不能回到a里面foo().我知道它尝试Foo使用复制构造函数初始化返回类型,但由于某种原因它无法使用它.
为什么它不能使用我提供的拷贝构造函数?我知道explicit …
我预计
type family Rep a
Run Code Online (Sandbox Code Playgroud)
和
type family Rep :: * -> *
Run Code Online (Sandbox Code Playgroud)
是一样的,但似乎有区别
type family Rep a
type instance Rep Int = Char
-- ok
type family Rep :: * -> *
type instance Rep Int = Char
-- Expected kind * -> *, but got 'Int' instead
Run Code Online (Sandbox Code Playgroud)
我只是偶然发现了一个Haskell扩展错误,还是有一些指向这种行为?