小编Moz*_*lah的帖子

为什么从Int到Int只有一个非严格的函数?

根据这篇关于Haskell的指称语义的文章,从Int到Int只有一个非严格(非底部保留)函数.

报价:

碰巧只有一个类型为Integer - > Integer的非严格函数的原型:

一个x = 1

对于每个具体数字k,其变体是constk x = k.为什么这些是唯一可能的?请记住,一个n可没少比一个⊥定义.由于Integer是一个扁平域,因此两者必须相等.

基本上它表示该类型签名的唯一非严格函数只能是常量函数.我不遵循这个论点.我也不确定平面域是什么意思,文章的其余部分导致相信它只是意味着值的集合只有一个节点:bottom.

函数从A-> A或A-> B出现类似的情况?那是他们必须是不变的功能?

computer-science haskell functional-programming

16
推荐指数
2
解决办法
590
查看次数

什么是Haskell中类型的coproduct(不相交联合)的语法?

考虑以下

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

12
推荐指数
2
解决办法
5054
查看次数

为什么Haskell中的coproduct类型没有简单的语法?

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

8
推荐指数
1
解决办法
1363
查看次数

为什么Haskell有非严格的函数(语义)?

根据这篇关于haskell中指称语义的文章 所有类型都有底部,函数f:A-> B是严格的,如果它将类型A的底部映射到类型B的底部,那么它被称为非严格的其他类型.

(这让人联想到一个尖刻的类别,其中态射保留了基点).

为什么Haskell有非严格的函数,而标准ML没有?

computer-science haskell functional-programming category-theory

5
推荐指数
3
解决办法
945
查看次数

如何在不同的名称空间中放置haskell字段名称?

考虑以下两种类型:

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)

由此我们可以看出,我们应该能够期望每个字段名称应该在它们各自的类型名称空间内.

我的用法是正确的还是我的期望错了?有没有办法解决这个问题?

haskell

5
推荐指数
1
解决办法
146
查看次数