小编AJF*_*mar的帖子

滥用代数数据类型的代数 - 为什么这样做?

代数数据类型的"代数"表达式对于具有数学背景的人来说非常具有启发性.让我试着解释一下我的意思.

定义了基本类型

  • 产品
  • 联盟 +
  • 独生子 X
  • 单元 1

并使用简写X•X2XX+X等等,我们就可以定义如链表代数表达式

data List a = Nil | Cons a (List a)L = 1 + X • L

和二叉树:

data Tree a = Nil | Branch a (Tree a) (Tree a)T = 1 + X • T²

现在,我作为数学家的第一直觉是坚持这些表达方式,并试图解决LT.我可以通过重复替换来做到这一点,但似乎更容易滥用符号,并假装我可以随意重新排列.例如,对于链接列表:

L = 1 + X • L

(1 - X) • L = 1

L = 1 …

ocaml haskell functional-programming algebraic-data-types miranda

277
推荐指数
7
解决办法
1万
查看次数

如何记住选中的行并在UITableView中默认重新加载后维护它们?

如何设置默认选择的行?我想选择一行,获取所选行的数量,indexpath.row然后重新加载表并选择所选行.有谁可以帮助我吗?我可以在方法中获取所选行 - (IBAction)segmentedControlIndexChanged吗?不在didSelectRowAtIndexPath

这是我的代码,如果它可以帮助您理解

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    //lbl1 = [[UILabel alloc]initWithFrame:CGRectMake(200, 10, 100, 20) ];

    // Configure the cell...
    NSString *depdateChoosed=[deparatureDates objectAtIndex:depSelectedIndice];
    NSString *comeateChoosed=[deparatureDates objectAtIndex:comSelectedIndice];
    NSString *choosedDate =[NSString stringWithFormat:@"%@%@",depdateChoosed, comeateChoosed];
    NSLog(@"date choisi %@ ",choosedDate);

    if(segment.selectedSegmentIndex==0)
    {
        cell.textLabel.text =[deparatureDates objectAtIndex:indexPath.row];        
    }
    else if(segment.selectedSegmentIndex==1) {
         //cell.textLabel.text =[goingBackDates …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ios4 ios

29
推荐指数
4
解决办法
6万
查看次数

库里 - 霍华德是双重否定的通讯员((a-> r) - > r)还是((a->⊥) - >⊥)?

这是库里 - 霍华德的双重否定的记者a; (a -> r) -> r或者(a -> ?) -> ?,或两者兼而有之?

两种类型都可以在Haskell中编码如下,其中?编码为forall b. b.

p1 :: forall r. ((a -> r) -> r)
p2 :: (a -> (forall b. b)) -> (forall b. b)
Run Code Online (Sandbox Code Playgroud)

Wadler 2003的论文以及 Haskell中的实现似乎采用了前者,而其他一些文献(例如本文)似乎支持后者.

我目前的理解是后者是正确的.我理解前者的风格,因为你可以创建类型的值的困难a,从forall r. ((a -> r) -> r)使用纯计算:

> let p1 = ($42) :: forall r. (Int -> r) -> r
> p1 id
42
Run Code Online (Sandbox Code Playgroud)

这似乎与你不能获得直觉逻辑相矛盾 …

continuations haskell curry-howard

21
推荐指数
2
解决办法
625
查看次数

为什么GHC元组限制为62?

来自Haskell 98的报告:

元组的大小没有上限,但是一些Haskell实现可能会限制元组的大小,并限制与较大元组相关联的实例.但是,每个Haskell实现必须支持最大为15的元组,以及Eq,Ord,Bounded,Read和Show的实例.(......)

然而,众所周知,GHC不支持大于62的元组.这是当我尝试在GHCi中创建大小为63的元组时发生的情况:

<interactive>:1:1: error:
    A 63-tuple is too large for GHC
      (max size is 62)
      Workaround: use nested tuples or define a data type
Run Code Online (Sandbox Code Playgroud)

我承认,这是按照哈斯克尔98规范,同时又有大小比62更大的元组很可能是高度不必要的,但我不明白到底为什么,这是因为它是在GHC.


总结一下:

  • 为什么会出现元组大小限制?
  • 为什么尺寸限制在62?

此外:

  • 为什么仅从GHC 6.12.2开始就是这种情况?
  • 其他突出的Haskell实现是否这样做?他们的理由是什么?

size haskell tuples compiler-errors compiler-specific

21
推荐指数
1
解决办法
1732
查看次数

编写高阶函数来捕获常见模式haskell

f1 [] = 1
f1 (x:xs) = x * f1 xs

f2 [] = 0
f2 (x:xs) = 1 + f2 xs

f3 [] = 0
f3 (x:xs) = x + f3 xs

f4 [] = []
f4 (x:xs) = x ++ f4 xs
Run Code Online (Sandbox Code Playgroud)

这些都有一个共同的行为,我究竟如何识别模式并编写高阶函数来捕获它?

haskell functional-programming

15
推荐指数
2
解决办法
591
查看次数

Haskell中的do-notation变量的类型是什么?

以下代码非常清楚:

do 
  x <- Just 3
  y <- Just "!"
  Just (show x ++ y)
Run Code Online (Sandbox Code Playgroud)

这里的类型xNumyString.(<-这里用来取出Monad的实际价值)

但是,这个片段对我来说不太清楚:

import Control.Monad.Instances
addStuff :: Int -> Int
addStuff = do
  a <- (* 2)
  b <- (+ 10)
  return (a + b)
Run Code Online (Sandbox Code Playgroud)

这里有什么类型a和类型b?他们似乎像一个Num,但a <- (* 2)b <- (+ 10)这里看上去很神秘,...

有没有人有这个想法?

monads haskell functional-programming do-notation

13
推荐指数
2
解决办法
391
查看次数

为什么Haskell monadic绑定左关联?

>>=>>运营商都infixl 1.为什么左关联?

特别是,我观察到等价:

(do a; b; c ) == (a >> (b >> c))   -- Do desugaring
(a >> b >> c) == ((a >> b) >> c)   -- Fixity definition
Run Code Online (Sandbox Code Playgroud)

因此do,对于固定性定义自然如何工作的方式不同,这是令人惊讶的.

monads haskell

13
推荐指数
2
解决办法
446
查看次数

在(=)符号后用空格分配变量?

在Bash中,使用T=content在等号之前或之后没有空格的情况下为变量赋值.

尽管我在shell脚本PWD= /bin/pwd 中看到了以下内容,其中包含等号右侧的空格.

它有什么用途?

bash shell sh

12
推荐指数
3
解决办法
6178
查看次数

Haskell类型中波形符的含义(类型相等)

我一直在搞乱这个fix功能,我碰巧遇到了这个问题:

? let fix f = let x = f x in x
? fix (+)

<interactive>:15:5:
    Occurs check: cannot construct the infinite type: t ~ t -> t
    Expected type: t -> t
      Actual type: t -> t -> t
    Relevant bindings include it :: t (bound at <interactive>:15:1)
    In the first argument of ‘fix’, namely ‘(+)’
    In the expression: fix (+)
Run Code Online (Sandbox Code Playgroud)

我完全知道为什么会出现这个错误,但我注意到那里有一个有趣的签名:t ~ t -> t.这种类型意味着什么?什么代字号在haskell中的类型签名中意味着什么?他们在哪里使用?

haskell types tilde

12
推荐指数
1
解决办法
3824
查看次数

如何在`Cygwin`中安装`build-essential`?

如何安装build-essentialCygwin
我尝试过使用:apt-cyg install build-essential 但是不起作用.

Installing build-essential
Package build-essential not found or ambiguous name, exiting
Run Code Online (Sandbox Code Playgroud)

我也有以下问题:

(gedit: 13864): Gtk-WARNING **: can not open display:
Run Code Online (Sandbox Code Playgroud)


所以我无法安装紧缩.看见:

$ make all
Building binary...
/usr/bin/gcc -pthread -Wall -pedantic -std=c99 undefined crunch.c -lm -o crunch
gcc: error: undefined: No such file or directory
Makefile:48: recipe for target 'crunch' failed
make: *** [crunch] Error 1
Run Code Online (Sandbox Code Playgroud)

这有什么问题,我该如何解决?

linux windows cygwin

11
推荐指数
2
解决办法
1万
查看次数