[英]Function type mismatch
我有一個具有函數類型的函數:
newtonRootSequence' :: Double -> Double -> [Double]
和功能定義:
newtonRootSequence' xn d = [(xn + (d * (1/xn))) div 2] ++ newtonRootSequence' ((xn + (d * (1/xn))) div 2) d
收到兩個值xn和d時,應計算給定函數的結果
[(xn + (d * (1/xn))) div 2]
但是由於某種原因,編譯器在啟動時不接受帶有錯誤的函數:
無法匹配預期的類型'(Integer-> Integer-> Integer->)-> Integer-> Double與實際類型double函數(xn +(d *(1 / xn)))div 2)應用於兩個參數
我嘗試將方程式的結果發送到遞歸步驟的部分發生此錯誤
++ newtonRootSequence' ((xn + (d * (1/xn))) div 2) d
正如評論中已經提到的:
div
作為中綴函數,則必須將其括在反引號中 div
用於整數除法,向負無窮大的方向截斷,而不用於Double
的除法 這兩點是導致您出現錯誤消息的原因。
要對Doubles
除法,請像在表達式1/xn
一樣使用/
運算符。
有了這個,您的代碼就可以工作了。 為了清楚起見,可以對其進行轉換:
提取重復的表達式以將序列中的下一個xn
計算到where
子句中。 表達式也可以稍微簡化。 只需使用cons運算符(:)
即可在列表前面添加單個元素:
newtonRootSequence' xn d = xn' : newtonRootSequence' xn' d where xn' = (xn + (d / xn)) / 2
您可以使用Prelude中的iterate :: (a -> a) -> a -> [a]
a- iterate :: (a -> a) -> a -> [a]
將單個步驟的計算與生成的中間步驟列表分開(請注意翻轉的參數):
sequenceStep :: Double -> Double -> Double sequenceStep s xn = (xn + (s / xn)) / 2 newtonRootSequence' :: Double -> Double -> [Double] newtonRootSequence' s x0 = iterate (sequenceStep s) x0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.