我是still試圖實現2-3根手指樹,我取得了很好的進展(repository)。在做一些基準測試時,我發現當樹很大時,我的基本toList結果爲StackOverflowException。起初,我看到一個簡單的修復,並使其成爲尾遞歸。 不幸的是,事實證明,toList是不是罪魁禍首,但viewr是: /// Return both the right-most element and the
我要去了延續和我遇到兩種不同的方法來構造延續類型: newtype C r a = C {runC :: (a -> r) -> r}
exampleFunction :: String -> C Bool String
exampleFunction s = C $ \t -> if length s > 10 then t s else False
continuationFunct
我有一個很簡單的後續函數(使用簡單起見單子避免): data C a = C {unwrap :: (a -> a) -> a}
本質上講,我試圖執行根據輸入類型不同實施方式中,類似於(須藤代碼)的東西: data Gadt a where
AString :: String -> Gadt Bool
AInt :: Int -> Gadt Bool
data C a
這是展平二叉查找樹的一種方法。它的問題是當它構建的大函數最終應用於[]時,堆棧溢出。我想知道是否有合理的方法修復這段代碼片段而不完全改變它的工作方式。例如,如果構建一個自定義作曲家來構建一個函數樹,然後使用一個顯式堆棧來評估它們(因爲問題已經是將一棵樹展平了),那麼這將無濟於事。 let flatten_k t =
let rec f t (k:(list<'a>->list<'a>)
我試圖瞭解下面這個tutorial的延續。 然而,我有困難,瞭解在節2.10以下示例: # let get() =
shift (fun k -> fun state -> k state state) ;;
get : unit => ’a = <fun>
state是int我想類型。我沒有得到的是k的類型。按照我的理解,k捕獲所有計算get()後說到後來,因爲我們正在談論的狀態