What have you found for these years?

2009-12-11

VarArgs in Haskell

沒記錯的話好像是在 PLT 板看到,然後在嵐達網上提起這件事
就有人匿名貼了這份連結。又由於 ptt 全文搜尋不便嘛,
嵐達網東西也不會很多(汗顏),全部翻一下總算是找到了。

做道題娛樂一下
(對不起我轉繁體,因為 mac 版 firefox 碰到簡體字的話,字型會亂跳...)

唔,倒是才發現作者跟 AvgTree in Haskell 裡提到的作者是一樣的。
搞不好那個匿名連結也是本人貼的...? XDD 這樣世界還真的是有夠小!?
畢竟上篇提到的先寬度標記裡他就有發言過,所以是滿有可能的。
原本的 assignment 是這個 AFP Assignment 7

btw, 練 Haskell 真的有種回到過去的感覺,回到當年學 C 的感覺...
當然不是在說 Haskell 哪裡跟 C 像,而是那種懵懵懂懂,都還在摸索的感覺。
後來練 ActionScript 和 C++, 基本上都差不多是線性學習吧?
Ruby 也不用多說,基本上沒什麼難的,要指數成長甚至都沒問題。

但 Haskell... 就常常碰到瓶頸,卡住而發呆。而且卡住的時間,
應該也遠比最早學 C 的時間還要來得長了。一開始學時,
大概是 data structure 卡最久吧?不太懂 stack 要幹嘛。

我覺得這樣還滿有趣的,重新回到最初的初學者狀態,
也可以體會那種忽然間頓悟的感覺 XD

離題了...... 不過話說回來,如果能在國外念那些東西也滿好的。

回主題.. 裡面還有提到,有另一個更深入的玩法在這:
Functions with the variable number (of variously typed) arguments
又是 Oleg 啊!!真是什麼地方都看得到他的蹤影 XD
而且他網站上的東西都用 public domain,
有時候會覺得神人的東西很多都直接放成 public domain.. XD

總之就是把 count 和 zero 重新複習了一次。光是看懂真的沒用,
還要多練習,否則很快就會忘記了。來看看他 type inference...
首先我是取名為 Blackhole:

class Blackhole a where
zero' :: a
count' :: Integer -> a

假設現在有:
count "" 2 id :: Integer
....
很累,有空再推導一次好了。這邊先跳過。

翻了一下 Oleg 那篇,想到確實可以做 list generator
gen 1 2 3 :: [Integer] -- [1, 2, 3]
過程不多說了,試很久... 而且還是有參考 Oleg 的作法。
我不知道 class GenList a r | r -> a 裡的 | r -> a
是什麼意思,加了才能過。extension 要開 -XFunctionalDependencies
還有其他兩個分別是 -XMultiParamTypeClasses -XFlexibleInstances
也是改天再來查什麼意思... 其中還試到了 -XFlexibleContexts
但最後的成果似乎不需要開這個。可能需要看一下這個吧:
7.8. Other type system extensions
class GenList a r | r -> a where
gen' :: a -> [a] -> r

instance GenList a [a] where
-- gen' = (:)
-- gen' = curry $ reverse . (uncurry (:))
gen' x xs = reverse (x:xs)

instance GenList a b => GenList a (a -> b) where
-- gen' :: a -> [a] -> (a -> b)
gen' x xs = (flip gen') (x:xs)

gen :: (GenList a r) => a -> r
gen = (flip gen') []

其實原本是不想寫得跟 Oleg 一樣,但改到最後居然變一樣了...
雖然 arg 順序是不同啦,所以才有 flip.
原本寫成 gen' :: a -> [a]
發現這樣 GenList a (a -> b) 會產生出 [a -> b] 明顯不對。
切出 r 變成 gen' :: a -> r 則發現少了累加的參數?(細節忘了 ><)
再改成 gen' :: a -> r -> r 則導致累加的東西變成 [a -> b]
然後就改到跟 Oleg 一樣了 XD...

累昏了,反正就先筆記...

2 retries:

scm said...

關於任意參數,我想到的是這個:

http://www.eecs.usma.edu/webs/people/okasaki/hw02.ps

Chris Okasaki 2002 的 paper. 你可以寫這種程式:

begin push 5 push 6 add end

godfat 真常 said...

先不細看了,倒是讓我想到 deriving a virtual machine XDDD
或許可以用這個來做 byte code generator?

Post a Comment

All texts are licensed under CC Attribution 3.0