我有一个名为git branch的签出foo
.
> git status
# On branch foo
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)
它最初使用此命令检出:
> git checkout origin/foo -b foo --track
Run Code Online (Sandbox Code Playgroud)
我想从远程存储库获取此分支的更新.我知道这些命令中的任何一个都足够了:
> git fetch origin foo # ignore the lack of merging
> git pull origin foo
Run Code Online (Sandbox Code Playgroud)
如果我省略了fetch
or 的参数pull
,git默认会获取(或拉动)我当前检出的分支?也就是说,以下两对命令是否等效?
> git checkout foo
> git pull
Run Code Online (Sandbox Code Playgroud)
和
> git checkout foo
> git pull origin foo
Run Code Online (Sandbox Code Playgroud) 我有一个我想在Clojure中使用的Java类.但是,我想将它用作Clojure地图.这样做的步骤是什么?
我查看了代码IPersistentMap
- 如果Java类实现了吗?或者是否应该有一些实现协议的Clojure代码?
我知道我可以编写一些映射代码,将代码从Java对象显式转换为映射,但该解决方案具有很高的努力/回报率.此外,我可能会多次遇到同样的情况.
具体示例:我有一个用Java编写的解析器.我想使用它来解析一些文本,然后访问解析数据结构的内容,就像它在Clojure映射中一样:
(def parser (new MyParser))
(let [parse-tree (parser ... parse some text ...)]
((parse-tree :items) "itemid"))
Run Code Online (Sandbox Code Playgroud) 而不是fmap
将函数应用于函数值:
fmap :: Functor f => (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
我需要一个函数,其中函子有一个函数,值很简单:
thing :: Functor f => f (a -> b) -> a -> f b
Run Code Online (Sandbox Code Playgroud)
但我找不到一个.
这个模式叫做什么,我将函数函数(或者在应用程序中,或者在monad中)应用于普通值?
我已经实现了它,我只是不太明白我做了什么以及为什么标准库中还没有这样的功能.
我想要一个在运行时获取值类型的函数.使用示例:
(get-type a)
Run Code Online (Sandbox Code Playgroud)
其中a
已define
ð是一些任意的计划值.
我该怎么做呢?还是我这个实现自己使用的堆栈COND boolean?
,number?
等等?
我在REPL中玩耍,我有一些奇怪的行为:
Clojure 1.4.0
user=> (type {:a 1})
clojure.lang.PersistentArrayMap
user=> (def x {:a 1})
#'user/x
user=> (type x)
clojure.lang.PersistentHashMap
Run Code Online (Sandbox Code Playgroud)
我认为所有小的文字地图都是实例PersistentArrayMap
,但显然情况并非如此def
.为什么要使用def
Clojure为我的litte地图选择不同的表示?我知道这可能只是一些奇怪的实现细节,但我很好奇.
我有一个UICollectionViewController
:
- (NSInteger)collectionView:(UICollectionView *)collectionView
numberOfItemsInSection:(NSInteger)section {
return [self.pageTastes count];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath {
CellTasteCollectionView *cell =
[collectionView dequeueReusableCellWithReuseIdentifier:@"Cell"
forIndexPath:indexPath];
Taste *taste = [self.pageTastes objectAtIndex:indexPath.item];
[[cell imageView] setImage:taste.image];
[cell setObjectId:taste.objectId];
return cell;
}
Run Code Online (Sandbox Code Playgroud)
有用.我有这个viewDidLoad
,允许用户选择多个项目:
[self.collectionView setAllowsMultipleSelection:YES];
Run Code Online (Sandbox Code Playgroud)
我想什么都有,就是第一次的CollectionView负荷,某些项目编程选择的基础上,他们objectId
在CellTasteCollectionView
.
这是我如何做到这一点:
- (void)collectionView:(UICollectionView *)collectionView
didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
Taste *taste = [self.pageTastes objectAtIndex:indexPath.item];
printf("%s\n", [taste.objectId UTF8String]);
}
Run Code Online (Sandbox Code Playgroud)
当用户点击项目时调用它 - 这不是我想要的:我希望在UICollectionView
加载时自动选择项目.
我该怎么做呢?
我很难理解为什么这两个片段在所谓的"穷人严格分析"下会产生不同的结果.
第一个示例使用data
(假设一个正确的Applicative实例):
data Parser t a = Parser {
getParser :: [t] -> Maybe ([t], a)
}
> getParser (pure (,) <*> literal ';' <*> undefined ) "abc"
*** Exception: Prelude.undefined
Run Code Online (Sandbox Code Playgroud)
第二个用途newtype
.没有其他区别:
newtype Parser t a = Parser {
getParser :: [t] -> Maybe ([t], a)
}
> getParser (pure (,) <*> literal ';' <*> undefined ) "abc"
Nothing
Run Code Online (Sandbox Code Playgroud)
literal x
是一个解析器,如果其参数与第一个标记匹配,则成功使用一个输入标记.所以在这个例子中,它失败了因为;
不匹配a
.但是,该data
示例仍然看到下一个解析器未定义,而newtype
示例则没有.
具有某种反射/内省规范的语言的巨大好处之一是可以从各种来源自动构建对象.
例如,在Java中,我可以使用相同的对象来持久化到db(使用Hibernate),序列化为XML(使用JAXB),以及序列化为JSON(json-lib).您可以在Ruby和Python中执行相同的操作,通常也遵循一些简单的Java属性或注释规则.
因此,我不需要很多"域转移对象".我可以专注于我正在工作的领域.
它似乎在像Haskell和Ocaml这样非常严格的FP中,这是不可能的.特别是Haskell.我唯一看到的是进行某种预处理或元编程(ocaml).只是接受你必须从底部向上进行所有转换吗?
换句话说,您必须做很多无聊的工作才能将haskell中的数据类型转换为JSON/XML/DB Row对象,然后再转换回数据对象.
我发现monad变换器的一个问题是需要lift
将操作转换为正确的monad.单lift
在这里和那里也不错,但有时也有功能类似如下:
fun = do
lift a
lift b
c
lift d
lift e
f
Run Code Online (Sandbox Code Playgroud)
我希望能够这样编写这个函数:
fun = monadInvert $ do
a
b
lift c
d
e
lift f
Run Code Online (Sandbox Code Playgroud)
这会减少lift
s 的数量并使代码更清晰.
问题是:对于monads是monadInvert
可能的?应该如何创建这个功能?
加分点:定义它monad m
的实例MonadIO
.
这个问题的标题提到了排列:实际上,我们如何处理monad变换器堆栈的任意排列?
Clojure语言的创建者声称 "开放的,大型的函数集在一个开放的,小的,可扩展的抽象集合上运行是算法重用和库互操作性的关键".显然,它与典型的OOP方法相矛盾,在这种方法中,您创建了大量的抽象(类)和一组相对较少的函数.请建议一本书,一本书中的章节,一篇文章或您的个人经历,详细说明这些主题:
*MFUFA:"很少抽象的功能"