我以前使用過類型,但不知道不透明類型是什麼。我也看到它也被提及。公開不透明類型比類別別名更好?什麼是榆樹中的不透明類型,爲什麼它很有價值?
9
A
回答
13
讓我們首先看類型別名回答這個問題:
類型別名是完全透明的。這意味着任何其他導入它的模塊都可以完全訪問其內部工作。比方說,我們已經有了一個User
模塊露出User
類型:
module User exposing User
type alias User =
{ userName : String
, age : Int
}
任何人進口User
可以操縱數據,例如newUser = { oldUser | age = 25 }
。或者做someUser = User "Bill" 27
。當您控制它們存在的上下文時,這些操作很好。
但是,如果User
是庫的一部分,那麼對User
類型的每次更改都會對使用該庫的人造成重大改變。例如,如果在User
中添加了email
字段,則構造函數示例(someUser = User "Bill" 27
)會給出編譯器錯誤。
即使在項目代碼庫的內部,類型別名也可以向其他模塊提供太多信息,從而導致難以維護和發展的代碼。在某些時候,User
可能會發生急劇變化,並具有一組全新的屬性。無論代碼如何處理User
s,都需要進行更改。
不透明類型是有價值的,因爲它們可以避免這些問題。下面是User
不透明版本:
module User exposing User
type User =
User
{ userName : String
, age : Int
}
在這個版本中,其他模塊不能直接訪問或操縱數據。通常情況下,這意味着你將和揭露一些getter和功能:
initUser : String -> Int -> User
userName : User -> String
age : User -> String
setAge : Int -> User -> User
這是更多的工作,但它的優點:
- 其它模塊只關心
User
功能,不需要知道的是在類型 - 類型可以不破壞模塊包含
之外的代碼更新哪些數據210
這在很大程度上解釋來自@wintvelt:elmlang.slack.com
相關問題
- 1. 爲什麼榆樹不使用括號?
- 2. 什麼類型的價值?
- 3. 什麼是「不透明」鍵?
- 4. 什麼是價值1.0e + 1的類型
- 5. 該類型的價值是什麼?
- 6. 什麼是內在價值類型?
- 7. 榆樹不推斷沒有什麼值正確
- 8. 爲什麼singletone類的價值是零?
- 9. 術語「不透明類型」在「CFBundleRef不透明類型」的上下文中是什麼意思?
- 10. 爲什麼填充0xFFFFFFFF是透明的?
- 11. C#中透明類或透明方法是什麼?
- 12. 不透明列時出現類型轉換錯誤,爲什麼?
- 13. 什麼是不透明的字段?
- 14. 爲什麼是空?價值的傳遞有什麼問題?
- 15. 什麼是python中的類,它做什麼,它爲什麼需要它?
- 16. 什麼是價值?
- 17. 爲什麼我的透明圖標不會呈現爲透明?
- 18. 爲什麼不能有一個類型參數是什麼?
- 19. Rails模型中自我的價值是什麼?爲什麼不提供明顯的實例方法?
- 20. 什麼是WidgetProvider的appWidgetIds []?爲什麼總是得到它的價值0?
- 21. 什麼`... |類型聲明中的b - > c是什麼意思?
- 22. 這是爲什麼按價值計價?
- 23. 需要透明類型的好處和情況是什麼?
- 24. 爲什麼JFrame仍然不透明?
- 25. Java 7中「非不透明值」的含義是什麼?
- 26. 榆樹中的翻譯模式是什麼?
- 27. 爲什麼透析器找到我的類型說明無效?
- 28. 爲什麼我的'透明'覆蓋視圖不透明?
- 29. 爲什麼值類型不能爲空
- 30. 什麼是string array [] =「」;是什麼意思?爲什麼它有效?
下面是庫的作者和包約值一些更多的討論:http://package.elm-lang.org/help/design-guidelines#keep-tags -and-record-constructors-secret – Nathan
感謝分享這個解釋。因爲它的大約一半是我早些時候在Slack([這裏](https://elmlang.slack.com/archives/design-patterns/p1480011953000265))上發佈的答案的確切副本,所以提及或鏈接應該是不錯。 – wintvelt
嘿@wintvelt:對不起!我認爲這是一個非常好的答案,有助於生活在更加持久的地方。我爲您的SO帳戶添加了一個參考。也許一個SO MOD可以將你添加爲作者? – Nathan