Skip navigation.

Posts tagged with "Haskell"

关于Haskell中的类型

Haskell的类型独特,变化较多,第一次接触感觉确实有点摸不到头脑。 :t命令用来查看变量/函数/表达式的类型,比如:
:t "hello"
"hello" :: [Char]
"hello"是由Char类型组成的List。
:t tail
tail :: [a] -> [a]
->前面的是函数接收的参数类型,后面的是返回值类型。上面表明tail可以接收任何类型,并且返回一个同类型的值。 这很容易理解,比如: tail [1,2,3,4]
就得到:
[2,3,4]
tail "hello"也可以,就能得到:
"ello"

这是简单的情况,下面看个稍微复杂的:
假设函数f的类型是Float -> Float,也就是说它接收一个Float参数,并返回Float值,这和C/C++还不一样,因为Haskell是functional语言,所以Float -> Float只能单纯地做数值计算,换句话说,就是不能做一些额外的其他东西,比如打印最后的结果。 现在,我们想要f计算并打印出结果,那么f的类型就变了,就应该是: Float -> (Float,String) 。

Haskell syntax

,

刚才看到一篇文章,对比编程语言语法的,感觉不错,力挺传说中的Haskell~

文章拿出来对比的例子是fibonacci数列,如下:
(这是PHP?怪不得这么眼熟~~)
function generate_fibonacci_sequence( $length ) {
        for( $l = array(1,1), $i = 2, $x = 0; $i < $length; $i++ )
                $l[] = $l[$x++] + $l[$x];
    
        return $l;
    }
PHP只不过是Perl的一个子集,既然后面也拿出了Perl,就没必要再用PHP了吧~ (这肯定是Perl~)
sub fibo
    {
        my ($n, $a, $b) = (shift, 0, 1);
        ($a, $b) = ($b, $a + $b) while $n-- > 0;
        $a;
    }
(下面这个就是传说中的Python了~)
def fib(n):
        if   n < 2: return 1
        else      : return fib(n - 1) + fib(n - 2)
(哈!这肯定是Lisp!)
(define fibo
     (lambda (x)
       (if (< x 2)
         x
         (+ (fibo (- x 1)) (fibo (- x 2))))))
(最后Haskell亮相)
    fib 0 = 0
    fib 1 = 1
    fib n = fib (n-1) + fib (n-2)
确实,Haskell够精练的,起码这个例子如此。有机会仔细去学一下~