2016-10-19 18 views
2

剛開始做Haskell時,我被賦予執行基本GCF函數的任務,類似於計算階乘函數的函數。 這是我想出了Haskell中的GCF與elses

ggt :: Integer -> Integer -> Integer 
ggt m n = if m < n then ggt n m 
      else if n==0 then m 
      else ggt n (m mod n) 

我看到的答覆here,然而,在一個完全不同的方式做了比我已經證明到目前爲止,(我認爲這就是所謂的保護模式)。我的問題是我的代碼將不會加載它說

* Couldn't match expected type `(Integer -> Integer -> Integer) 
            -> Integer -> Integer' 
        with actual type `Integer' 
    * The function `m' is applied to two arguments, 
     but its type `Integer' has none 
     In the second argument of `ggt', namely `(m mod n)' 
     In the expression: ggt n (m mod n) 
Failed, modules loaded: none. 

我不明白爲什麼類型不匹配(我有三個整數,兩成輸入,m和n,以及作爲一個一個回報),作爲一個新手,我不知道第二個錯誤究竟意味着什麼。

我會很感激任何和所有幫助以及各種解釋!

乾杯!

+2

你想(MOD m×n個)或''''米mod' n'''。 – hao

+0

也就是'm \'mod \'n'。 – chepner

回答

1

非運算符函數名稱必須包含在反引號中以用於中綴位置。也就是說,

ggt :: Integer -> Integer -> Integer 
ggt m n = if m < n then ggt n m 
      else if n==0 then m 
      else ggt n (m `mod` n) 

否則,m將被視爲取mod函數作爲第一個參數和n作爲其第二個函數的名稱。這樣的函數將有類型(Integer -> Integer -> Integer) -> Integer -> Integer,但m :: Integer,因此錯誤消息。

一個更清晰的方式來定義這個(嵌套if表達式不是最容易閱讀)將涉及一個簡單的警衛。

ggt :: Integer -> Integer -> Integer 
ggt m n | m < n = ggt n m 
ggt m 0 = m 
ggt m n = ggt n (m `mod` n) 

或具有更復雜的防護件,而不是3個獨立的模式相匹配:

ggt :: Integer -> Integer -> Integer 
ggt m n | m < n  = ggt n m 
     | n == 0 = m 
     | otherwise = ggt n (m `mod` n) 
+0

非常感謝!非常有用的注意事項反向中介反向! – Readler

+0

(該死,SO插入 – Readler

+0

該死的,真的在這裏苦苦掙扎,無論如何,我想說的是,通過這樣做,一個新的錯誤彈出,說預期的類型仍然與實際類型不匹配,因爲應用ggt我同意你和警衛的方法顯然是優越的(如果我理解正確的話,它本身就像一個「如果」本身,對嗎?),正如我已經實施的那樣,但我仍然很好奇我的位置錯誤在於! – Readler