我最近一直在學習Haskell,並正在與正在通過SICP工作的朋友交談。我們很好奇比較Common Lisp和Scheme,所以我決定將練習1.29轉換成Haskell。SICP練習中的Haskell數字類型層次結構
本練習使用表示數學求和函數Sigma的函數sigma。這個函數採用一個函數f來應用於每個項,一個下界,一個應用於每個項以得到下一項的函數,以及一個上界。它返回應用於每個術語的f的總和。
simpsonIntegral應該使用辛普森規則來使用「精確度」n近似函數f在範圍[a,b]上的積分。我無法使此功能正常工作,因爲似乎有些事情我不明白所涉及的類型。
此代碼將使用ghc版本6.12.1進行編譯,但simpsonIntegral將被賦予一個類型上下文(Integral a,Fractional a),它沒有任何意義,只要您調用該函數就會激活該函數。我一直在努力工作,但是我所做的顯然是一種黑客攻擊,所以我想在這裏問一下,這將如何處理。
人們如何習慣性地處理h中所需的積分 - >分數/實數轉換?我讀了很多東西,但沒有看到任何明顯和乾淨的東西。
sigma :: (Ord a, Num b) => (a -> b) -> a -> (a -> a) -> a -> b
sigma f a next b = iter a 0
where
iter current acc | current > b = acc
| otherwise = iter (next current) (acc + f current)
simpsonIntegral f a b n = 1.0 * (h/3) * (sigma simTerm 0 (1+) n)
where
h = (b - a)/n
simTerm k = (yk k) * term
where
yk k = f (a + h * k)
term =
case k of
0 -> 1
1 -> 1
otherwise -> if odd k then 4 else 2
關於fromIntegral的問題。我正在嘗試這個,但沒有在每個特拉維斯的答案的正確位置,我認爲這是行不通的,因爲根據這個http://www.haskell.org/tutorial/numbers.html數字不提供一個劃分運算符。是從返回類型和ghc的積分多態性推斷我想要一個小數返回類型? – asm 2010-08-07 11:11:52
是的,'fromIntegral'在其返回類型'b'中是多態的,因爲'b'(返回類型)允許是任何數據類型,它是'Num'類型類的成員。雖然'Num'類型不提供除法,但屬於該類型成員的某些數據類型確實提供了除法,例如'Double'。 – yfeldblum 2010-08-07 13:54:12