Clean语言

维基百科,自由的百科全书
跳转到导航 跳转到搜索
Clean
编程范型函数式
设计者拉德堡德大学软件技术研究组
发行时间1987年,​39年前​(1987
当前版本
    Module:EditAtWikidata第29行Lua错误:attempt to index field 'wikibase' (a nil value)
    型态系统强类型, 静态, 动态
    操作系统跨平台
    许可证简化BSD[1]
    文件扩展名.icl, .dcl, .abc
    网站clean.cs.ru.nl
    受影响于
    Lean, Miranda, Haskell
    影响语言
    Haskell, Idris[2]

    Clean,在开发期间称为Concurrent Clean,是纯函数式程序设计语言。Clean由荷兰拉德堡德大学自1987年开始制作和维护[3]

    概述[编辑]

    Clean和Haskell有很多相似之处:参照透明性英语referential transparence列表推导式守卫垃圾回收高阶函数柯里化惰性求值

    Clean是用C写成的。Clean程式很容易跨平台,在大部分情况下,要转移到另一个平台只需在那里重新编译一次即可,不用改动源代码。它可运行于WindowsMacintoshSolarisLinux。Clean具有叫做“ITasks”的面向任务编程工具箱。

    例子[编辑]

    一个在屏幕上打印"Hello World!"的程序:

    module hello
    
    Start :: String
    Start = "Hello, world!"
    

    第一行module hello,告诉编译器这个模组(或一个project的部分)叫“hello”。除非你改变了这一行,否则它必须储存于一个叫hello.icl的档案。之后的一行,Start :: String,表示这个变数Start的type是String。最后一行表示这个变数是“Hello, world!”。因为这里无指定用GUI,所以这句“Hello, world!”会显示在控制台(console)之中。

    阶乘:

    fac :: Int -> Int
    fac 0 = 1
    fac n = n * fac (n-1)
    
    Start = fac 10
    
    fac :: Int -> Int
    fac n = prod [1..n] // The product of the numbers 1 to n
    
    Start = fac 10
    

    斐波那契数列

    fib :: Int -> Int
    fib 0 = 1
    fib 1 = 1
    fib n = fib (n - 2) + fib (n - 1) 
    
    Start = fib 7
    
    fibs :: Int Int -> [Int]
    fibs x_2 x_1 = [x_2:fibs x_1 (x_2 + x_1)]
    
    fib :: Int -> Int
    fib n = (fibs 1 1) !! n
    
    Start = fib 7
    

    中缀算子:

    (^) infixr 8 :: Int Int -> Int
    (^) x 0 = 1
    (^) x n = x * x ^ (n-1)
    

    类型声明声称了这个函数是右结合中缀算子,具有优先级8:这声称了x*x^(n-1)等价于x*(x^(n-1))而不是(x*x)^(n-1)。这个算子预定义于Clean标准库StdEnv中。

    比较于Haskell[编辑]

    语法区别[编辑]

    Clean的语法非常类似于Haskell,具有一些值得注意的区别:[4]

    Haskell Clean 评论
    [ x | x <- [1..10] , isOdd x]
    
    [ x \\ x <- [1..10] | isOdd x]
    
    列表推导式
    x:xs
    
    [x:xs]
    
    cons算子
    data Tree a
      = Empty
      | Node (Tree a) a (Tree a)
    
    :: Tree a
      = Empty
      | Node (Tree a) a (Tree a)
    
    代数数据类型
    (Eq a, Eq b) => ...
    
    ... | Eq a & Eq b
    
    类断言和上下文
    fun t@(Node l x r) = ...
    
    fun t=:(Node l x r) = ...
    
    as模式
    if x > 10 then 10 else x
    
    if (x > 10) 10 x
    
    if

    一般而言,Haskell比Clean介入了更多的语法糖

    引用[编辑]

    1. ^ Download Clean. Clean. [23 July 2019]. (原始内容存档于2019-07-23). 
    2. ^ "Idris - Uniqueness Types". [2018-11-20]. (原始内容存档于2018-11-21). 
    3. ^ FAQ - Clean. [2021-02-27]. (原始内容存档于2019-05-25). 
    4. ^ ftp://ftp.cs.ru.nl/pub/Clean/papers/2007/achp2007-CleanHaskellQuickGuide.pdf[失效链接]

    外部链接[编辑]