根据这篇关于Haskell的指称语义的文章,从Int到Int只有一个非严格(非底部保留)函数.
报价:
碰巧只有一个类型为Integer - > Integer的非严格函数的原型:
一个x = 1
对于每个具体数字k,其变体是constk x = k.为什么这些是唯一可能的?请记住,一个n可没少比一个⊥定义.由于Integer是一个扁平域,因此两者必须相等.
基本上它表示该类型签名的唯一非严格函数只能是常量函数.我不遵循这个论点.我也不确定平面域是什么意思,文章的其余部分导致相信它只是意味着值的集合只有一个节点:bottom.
函数从A-> A或A-> B出现类似的情况?那是他们必须是不变的功能?
考虑以下
data Point=Point{x::Float,y::Float}
data Shape=Circle{centre::Point,radius::Float}
|Rectangle {uleft::Point,bRight::Point}
Run Code Online (Sandbox Code Playgroud)
这里的Shape类型是Circle和Rectangle两种类型的副产品.我可能想在其他地方重用Circle和Rectangle类型.所以这样做会很有用:
data Point=Point{x::Float,y::Float}
data Circle=Circle{centre::Point,radius::Float}
data Rectangle=Rectangle {uleft::Point,bRight::Point}
data Shape =Circle | Rectangle
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时出现编译错误:Circle被声明两次.尝试这个的正确语法是什么,或者这不可能?
Haskell中的产品类型很容易定义:
data Person String String
Run Code Online (Sandbox Code Playgroud)
是两种类型的产品.两种类型的副产品是
type Shape=Either Circle Rectangle
Run Code Online (Sandbox Code Playgroud)
但是,虽然产品可以轻松扩展到三种或更多类型,但对副产品来说似乎并不那么简单.这种差异背后有理论上的理由,还是纯粹技术性的原因?
computer-science haskell functional-programming category-theory
根据这篇关于haskell中指称语义的文章 所有类型都有底部,函数f:A-> B是严格的,如果它将类型A的底部映射到类型B的底部,那么它被称为非严格的其他类型.
(这让人联想到一个尖刻的类别,其中态射保留了基点).
为什么Haskell有非严格的函数,而标准ML没有?
computer-science haskell functional-programming category-theory
考虑以下两种类型:
data Point=Point{x::Float,y::Float}
data Rectangle = {upperLeft::Point, bottomRight::Point}
data Square = {upperLeft::Point, bottomRight::Point}
Run Code Online (Sandbox Code Playgroud)
ghc编译器抱怨Rectangle中的upperLeft字段名称与Square的字段名称冲突.这看起来很奇怪,因为从表面上看,每个字段名称都应该在该类型的命名空间中,否则一个人不能重用字段名称,我怀疑这将是一个足够普遍的期望.
例如,要定义我们编写的变量:
let a=Rectangle{upperLeft=Point 2 3, bottomRight=Point 7 7}
let a=Square{upperLeft=Point 2 3, bottomRight=Point 7 7}
Run Code Online (Sandbox Code Playgroud)
由此我们可以看出,我们应该能够期望每个字段名称应该在它们各自的类型名称空间内.
我的用法是正确的还是我的期望错了?有没有办法解决这个问题?