我正在F#中構建一個解釋器。我試圖聰明地將原始操作符的解釋作爲函數調用(在這種情況下,作爲減少)。如何在字典中編碼不同類型的多個函數
這是想法:
let reduce fx values =
Array.reduce values fx
let primitivesEnv =
let r = Dictionary<string,'T -> 'T -> 'T>()
r.["int_+"] <- reduce (fun(l:int, r:int) -> l + r)
r.["int_-"] <- reduce (fun(l:int, r:int) -> l - r)
r
所以我以後可以做到這一點:
env.["int_+"]([| 1, 2 |])
當然,類型檢查拒絕這個與
警告FS0064:此構造使得代碼不如類型註釋所指示的 那樣通用。類型變量'T已被 約束爲類型''a - >'a - >'a'。錯誤FS0001:類型不匹配。 期待一個( '一個 - >' 一 - > '一) - >(' 一個 - > '一 - >' 一) - > '一 - >' 一 - > '一個 但給定一個(' 一個 - > '一 - >' 一) - > 'a'和 '一個將所得類型將 統一時是無限的'(' 一 - > '一 - >' 一) - >「一 - > '一 - > '一個」
PD:我知道如何做到這一點作爲一個簡單的翻譯,而是試圖建立一個解決方案,讓我建立幾十個通用的方式方法,不使爲每一個匹配。
通過簡單的解釋你的意思是大步解釋? – nicolas
我不確定你的意思是「解決方案,讓我以通用的方式構建數十種方法」 有很多種方法來構建解釋器,所以你需要在這裏更精確 – nicolas
如果這裏有python,我可以將函數存儲在一個字典中,並使用它來發送它們。現在F#中我面臨的問題是如何根據值類型進行派發,希望在不編碼所有情況下(所以,我可以爲解釋器準備好F#的內置函數)。 – mamcx