我发誓曾经有一件T恤出售,上面写着不朽的话:
什么部分

你不明白吗?
就我而言,答案就是......全部!
特别是,我经常在Haskell论文中看到这样的符号,但我不知道它的含义是什么.我不知道它应该是什么样的数学分支.
我当然认识到希腊字母的字母,以及诸如"∉"之类的符号(通常意味着某些东西不是一组的元素).
另一方面,我以前从未见过"⊢"(维基百科称它可能意味着"分区").我也不熟悉这里使用的vinculum.(通常它表示一个级分,但是这并不出现在这里是这种情况.)
如果有人至少可以告诉我从哪里开始想要理解这个符号海洋的含义,那将会有所帮助.
haskell functional-programming lambda-calculus hindley-milner denotational-semantics
想象一种语言,它不允许数据类型的多个值构造函数.而不是写作
data Color = White | Black | Blue
Run Code Online (Sandbox Code Playgroud)
我们会有
data White = White
data Black = Black
data Blue = Black
type Color = White :|: Black :|: Blue
Run Code Online (Sandbox Code Playgroud)
where :|:(这里不是|为了避免与sum类型混淆)是一个内置的类型union运算符.模式匹配可以以相同的方式工作
show :: Color -> String
show White = "white"
show Black = "black"
show Blue = "blue"
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,与副产品相比,它会产生扁平结构,因此您无需处理注射.而且,与sum类型不同,它允许随机组合类型,从而产生更大的灵活性和粒度:
type ColorsStartingWithB = Black :|: Blue
Run Code Online (Sandbox Code Playgroud)
我相信构造递归数据类型也不是问题
data Nil = Nil
data Cons a = Cons a (List a)
type List a = Cons a :|: Nil …Run Code Online (Sandbox Code Playgroud) 对Haskell来说是非常新的知识,它试图了解类型类和变量如何交互。
我要玩的第一件事是:
i :: a; i = 1
Run Code Online (Sandbox Code Playgroud)
我的期望是,由于我输入的字词尽可能通用,因此我应该绝对可以为其分配任何内容。(我知道我可能无法对变量i做任何事情,但这并不重要。)
但是我错了。上面给出了一个错误,并要求它是:
i :: Num a => a; i = 1
Run Code Online (Sandbox Code Playgroud)
经过多玩之后,我想到了以下内容:
g :: Num a => a -> a; g a = a + 1
g 1
(returned 2)
gg :: Num a => a; gg = g 1
gg
(returned 2)
Run Code Online (Sandbox Code Playgroud)
好的...到目前为止很好。让我们尝试一个小数参数。
g :: Num a => a -> a; g a = a + 1
g 1.3
(returned 2.3)
gg :: Num a => a; gg = g 1.3 …Run Code Online (Sandbox Code Playgroud) haskell types variable-assignment typeclass parametric-polymorphism
我有这个示例代码:
module Main where
import Data.Int
import Data.Text
data JavaValue = JavaString Text
| JavaByte Int8
| JavaShort Int16
| JavaInt Int32
| JavaLong Int64
| JavaFloat Float
| JavaDouble Double
| JavaChar Char
| JavaBool Bool
| ArrayValue [JavaValue]
| JavaNull deriving (Eq)
getnumberfromvalue :: Real c => JavaValue -> Maybe c
getnumberfromvalue (JavaByte n) =Just n
getnumberfromvalue (JavaShort n) =Just n
getnumberfromvalue (JavaInt n) =Just n
getnumberfromvalue (JavaLong n) =Just n
getnumberfromvalue (JavaFloat n) =Just n
getnumberfromvalue (JavaDouble …Run Code Online (Sandbox Code Playgroud)