我不是 Haskell 的專家。這個問題不完全是 Haskell 的問題,但我知道 Haskell 的人會更好地理解我想要實作的目標。
所以我正在構建一種動態語言,我希望它是純粹的……完全純粹的。(支持 IO 效果,我已經知道為什么,但這不是這個問題的一部分)
此外,我希望它具有某種形式的多型性,所以我正在考慮添加類支持的想法。
(此外,語言中的所有內容都應該是運算式,所以是的,沒有陳述句)
在探索這個想法時,我最終意識到為了使其參考透明,類運算式也應該能夠被替換。
類運算式的主要功能之一是檢查某個值是否是它的實體。
所以
val Person =class {...}
val person1 =Person(blabla)
Person.instantiated(person1) // returns true
// Equivalent to
class {...}.
instantiated(class{...}(blabla))
然而!最后一部分沒有意義......感覺不對,就像我創建了兩個不同的類
所以!
有沒有這樣的表達
val expr = <<expression>>
expr == expr // true
但是<<expression>> == <<expression>>是假的嗎?
用純語言?
我認為我問的相當于問newtypeHaskell 陳述句是否可以成為運算式
uj5u.com熱心網友回復:
根據您提出問題的方式,您可能至少會得到一些關于==運算子特性的答案(而且,在我寫這篇文章時,您已經收到了一條評論)。但是,這不是你要問的,所以忘記==. 回到你的課堂例子。
參考透明意味著在:
val Person = class {<PERSONCLASSDEFN>}
val person1 = Person(<PERSONARGS>)
兩個運算式:
Person.instantiated(person1)
和:
(class {<PERSONCLASSDEFN>}).instantiated((class {<PERSONCLASSDEFN>})(<PERSONARGS>))
應該是無法區分的。也就是說,如果一個程式被另一個替換,則程式的含義不應改變,反之亦然。
因此,類的身份必須僅取決于它們的定義(大括號中的部分),而不是它們在何處或多少次(重新)定義或給定的名稱。
作為一個更簡單的示例,您還應該考慮以下含義:
val Person = class {<CLASSDEFN>}
val Automobile = class {<CLASSDEFN>}
val person = Person(<ARGS>)
val automobile = Automobile(<ARGS>)
之后,這兩個物件person,并automobile應該是沒有什么區別。
uj5u.com熱心網友回復:
我發現很難看出這個問題實際上是關于什么的,但也許問題是當你真正指的是等價關系時,你在談論平等?
作為同一類實體的兩個物件通常不相等,相應地==將產生False。然而,就同一個類的實體而言,它們是等價的。它們是同一個等價類的成員(數學術語;OO 和 Haskell 中“類”一詞的用法都源于此)。
您可以將該等價類作為不同的運算子。就像,在 Python 中
def sameclassinstances(a, b):
return (type(a) is type(b))
根據您的語言的語法,當然也可以是自定義中綴運算子,例如
infix 4 ~=.
一個單獨的問題是,相等本身可以解釋為值相等(總是在 Haskell 中),或者某種形式的實作相等或參考相等,這在其他語言中相當普遍。但是如果你希望你的語言是純粹的,你可能應該遠離后者,或者給它一個像 Haskell 的reallyUnsafePtrEquality.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/363873.html
上一篇:使用匿名函式折疊
