簡體   English   中英

功能類型不匹配

[英]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一樣使用/運算符。

有了這個,您的代碼就可以工作了。 為了清楚起見,可以對其進行轉換:

  1. 提取重復的表達式以將序列中的下一個xn計算到where子句中。 表達式也可以稍微簡化。 只需使用cons運算符(:)即可在列表前面添加單個元素:

     newtonRootSequence' xn d = xn' : newtonRootSequence' xn' d where xn' = (xn + (d / xn)) / 2 
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM