【问题标题】:Haskell colon and dot syntax?Haskell冒号和点语法?
【发布时间】:2014-11-17 07:15:33
【问题描述】:

我在 Github 上查看的项目中遇到了以下代码:

data LispVal = Atom String
             | Number Integer
             | String String
             | Bool Bool
             | LispVal :. LispVal -- Cons

:. 语法到底是什么意思?没见过?

【问题讨论】:

  • 您可能已经看到x:xs 来构建列表。同样,:. 构造 LispVal
  • “奇怪的符号”在 Haskell 中几乎从来不是真正的特殊语法

标签: haskell


【解决方案1】:

:. 只是一个已定义的数据构造函数。您可以在 ghci 中玩一下以获得一个想法:

*Main> let a = Atom "test1"
*Main> let b = Atom "test2"
*Main> let c = a :. b
*Main> c
Atom "test1" :. Atom "test2"                         

我在您的代码中添加了deriving (Show),以便它在 REPL 中向我们显示字符串。你还可以看到它的类型:

*Main> :t (:.)
(:.) :: LispVal -> LispVal -> LispVal

因此,实际上它只是一个接受两个LispVal 值并返回LispVal 类型的值的函数。

【讨论】:

  • 它是一个数据构造函数,不是一个“正常”的函数。
【解决方案2】:

在 Haskell 中,“普通”变量以小写字母开头,构造函数名称以大写字母开头。这就是编译器可以区分它们的方式。

Haskell 还允许您定义全新的运算符。例如,您可以创建一个名为 ?+? 的新运算符,它会生成一个字符串,告诉您它做了什么:

x ?+? y = show x ++ " + " ++ show y ++ " = " ++ show (x + y)

到目前为止,一切都很好。

Haskell also 允许构造函数成为运算符。对于“普通”名称,如果第一个字母是小写的,它是一个普通变量,如果它是大写的,它是一个构造函数。对于运算符,如果第一个字符是:,那么它是一个构造函数,否则它是一个“普通”运算符。

您可能已经看过列表类型,它有两个构造函数,[](很神奇)和:。显然,运算符:“以”: 开头。但是你可以自己发明新的:

data Foobar = Int :?? String deriving Show

test = 5 :?? "banana"

只要运算符以: 开头,它就可以出现在data 声明中。

【讨论】:

    猜你喜欢
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多