[英]Using functional language concepts with OO - is there a language?
我最近在想着在編寫Pythonic程序時我並不總是使用OO的漂亮概念。 特別是,我認為我有興趣看到一種語言,我可以編寫典型的Web腳本
# Fictional language
# This script's combined effect is to transform (Template, URI, Database) -> HTTPOutput
HTTPOutput:
HTTPHeaders + Maintext
Flags: # This is a transform URI -> Flags
value = URI.split('?').after
refresh = 'r' in value
sort = /sort=([a-z])/.search(value)
HTTPHeaders: # This is a transform Flags -> HTTPHeaders
'Content-type:...' + Flags.refresh ? 'Refresh: ...' : ''
Maintext:
Template.replace('$questions', PresentedQuestions [:20] )
Questions:
(Flags.sort = 'r') ? RecentQuestions : TopQuestions
PresentedQuestions:
Questions % '<h4>{title}</h4><p>{body}</p>'
RecentQuestions:
Database.Questions . sort('date')
TopQuestions:
Database.Questions . sort('votes')
走着瞧吧? 我想盡可能多地制作物品; 每個段落聲明我稱之為變換的東西。 例如,有一個轉換HTTPHeaders
。 在命令式語言中,它將是類,對象和函數的組合聲明:
class HTTPHeaders_class
{
public char* value
HTTPHeaders_class()
{
value = ... + Flags.refresh ? + ... // [1]
}
}
class Flags_class
{
public char* flagstring;
public bool refresh;
...
Flags_class()
{
value = ... /* [3] */
refresh = ...
}
}
Flags = new Flags_class (URI)
HTTPHeaders = new HTTPHeaders_class (Flags) // [2]
但是,我想無法指定對象應該更改,除非對象的輸入發生變化; 並沒有辦法產生副作用。 這大大簡化了語言。 我相信這意味着我們正在進行函數式編程 (“將計算視為數學函數的評估並避免狀態和可變數據的編程范例”)。
我當然嘗試使用像Python類,MVC框架和Django這樣的東西(感謝答案),但我不認為他們有上面和下面的概念。
value
字段,可以通過編寫類名來引用它。 HTTPHeader
,則意味着盡快創建靜態的, HTTPHeader
更改的對象HTTPHeader
。 然后,對HTTPHeader
所有引用都引用此對象。 URI
對象重復該程序。 由於Flags
僅依賴於Flags
上的URI
和HTTPHeaders
,因此不會重新計算這些Flags
。 但是,如果Database
被修改,那么Questions
需要重新計算,因此HTTPOutput
可能隨之改變。 我相信這對於沒有副作用的Web腳本等程序來說是一個有用的模型。 是否有一種有用的語言可以寫出與此類似的程序?
這實際上感覺非常像Haskell,除了你沒有在這里使用純函數。 例如, Flags
沒有傳遞URI; URI
是一個單獨的定義,可能每次調用時都不會生成相同的URI,依此類推。
要使URI
成為純函數,它必須有一個參數可以為它提供當前請求,因此它總是可以為相同的輸入返回相同的值。 (沒有任何參數可以處理,純函數只能在閉包的整個生命周期內返回相同的結果。)但是,如果你想避免每次都明確地給URI
一個參數,這可以通過各種技術來完成; 我們在Haskell中使用monads。
在我看來,您正在考慮的編程風格可能基於“組合器”,其具有在框架內粘合在一起的小功能,以產生執行整體處理的大型復雜功能。
我看到我最喜歡的語言還沒有被提及,所以我想進入並建議Dyalog APL作為100%函數編程的語言。 APL有悠久的歷史,並且在沒有互聯網的情況下開發 - 但Dyalog是最活躍的APL實施提供商,他們還擁有一個免費提供的功能齊全的網絡服務器 。 (翻譯也可以免費用於非商業用途。)
我不認為它正是您正在尋找的,但Scala嘗試在一種通用語言下集成OO和功能特性。
您的代碼看起來像是用於Web應用程序的DSL,而Sinatra就是這樣的DSL。 Sinatra並沒有完全按照你的方式去做,但它在同一個球場。 http://www.sinatrarb.com/ - 它是用Ruby編寫的,但是嘿,讓我們在動態語言中成為朋友。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.