我不太了解 Haskell 优化在内部是如何工作的,但我一直在使用过滤器,希望它们被优化为与 C++ 中的简单 if 等效的东西。例如
mapM_ print $ filter (\n -> n `mod` 2 == 0) [0..10]
Run Code Online (Sandbox Code Playgroud)
将编译成相当于
for (int i = 0; i < 10; i++)
if (i%2 == 0)
printf("%d\n", i);
Run Code Online (Sandbox Code Playgroud)
对于长列表(10 000 000 个元素),基本列表似乎是正确的,filter
但如果我使用 monadic ,则存在巨大差异filterM
。我为此速度测试编写了一段代码,很明显,filterM
使用when
.
import Data.Array.IO
import Control.Monad
import System.CPUTime
main :: IO ()
main = do
start <- getCPUTime
arr <- newArray (0, 100) 0 :: IO (IOUArray Int Int)
let
okSimple i = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试手动更改UIDynamics
视图的旋转,但视图的旋转始终在更新后重置.该文件说,该UIDynamicAnimator
的updateItemUsingCurrentState:
方法应该更新项目的位置和旋转,而只是位置更新.
我创建了一个简短的示例,其中方形视图从屏幕上掉落,触摸后应将其定位到触摸位置并旋转到45度.但是,不会发生旋转(有时可以看到旋转几分之一秒,但之后会再次重置):
#import "ViewController.h"
@interface ViewController ()
{
UIDynamicAnimator* _animator;
UIView* _square;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
_square = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
_square.backgroundColor = [UIColor grayColor];
[self.view addSubview:_square];
_animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[_square]];
gravityBehavior.magnitude = 0.1;
[_animator addBehavior:gravityBehavior];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
_square.center = [touch locationInView:self.view];
NSLog(@"transform before rotation: %@", …
Run Code Online (Sandbox Code Playgroud)