簡體   English   中英

在OO中使用函數式語言概念 - 是否有語言?

[英]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這樣的東西(感謝答案),但我不認為他們有上面和下面的概念。

  1. 每個對象都有一個value字段,可以通過編寫類名來引用它。
  2. 如果在某處引用HTTPHeader ,則意味着盡快創建靜態的, HTTPHeader更改的對象HTTPHeader 然后,對HTTPHeader所有引用都引用此對象。
  3. 假設我想在解釋器仍在內存中時使用相同的URI對象重復該程序。 由於Flags僅依賴於Flags上的URIHTTPHeaders ,因此不會重新計算這些Flags 但是,如果Database被修改,那么Questions需要重新計算,因此HTTPOutput可能隨之改變。
  4. 解釋器自動推導出初始化類的正確順序。 當然,他們的依賴必須形成一棵樹。

我相信這對於沒有副作用的Web腳本等程序來說是一個有用的模型。 是否有一種有用的語言可以寫出與此類似的程序?

如果您真的想深入研究使用Python進行Web應用程序開發,那么請查看Django 在這種情況下,最好使用MVC架構,Django在支持MVC應用程序方面做得非常好。

您可能感興趣的更多是聲明性編程方法而不是功能性方法。 函數式編程更關注將輸入映射為純(數學)函數。 聲明性方法是關於說明應該發生什么而不是如何做到這一點。

無論如何,深入了解Model-View-Controller和Django。 您可能會發現它以完全不同的方式符合法案。

看看F# 它專門設計為一種功能語言(基於OCaml ),具有利用.NET堆棧的OO支持。

這實際上感覺非常像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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM