2014-11-17 74 views
0

我正在寫一個函數,它接受一個多項式數據類型並將其編譯到它所表示的函數中。接受兩個函數並返回一個添加結果的函數

例如(恆4)僅僅是恆定4,

(添加保利)可以是添加(恆1)(恆定4)

在該函數應該返回功能(\ n> 1 + 4)

如果是Add(常量1)變量,函數應返回(\ n-> 1 + n)。

的問題是,在頂層,我有

makePoly :: Poly -> (Int->Int) 
makePoly (PConst n) = \n->n 
makePoly (Add p1 p2) = makePoly p1 ?? makePoly p2 <- what should I do here? 

如何編譯這些2返回功能(可行回來爲(\ N-> N)(\ N->ñ )如果他們都是常量)加入?我應該添加一個輔助函數,它接受兩個函數並返回其輸出的總和?

編輯:如果是這樣的話,我該怎麼做呢?

add :: (Int->Int)->(Int->Int)->(Int->Int) 
add f g = ? 

再次編輯:答案的人搜索,通過@ user5402給出:

makePoly (Add p1 p2) = (\n -> (makePoly p1) n + (makePoly p2) n) 

回答

1
makePoly (Add p1 p2) = (\n -> (makePoly p1) n + (makePoly p2) n) 

移出:

  1. 創建第一個聚:makePoly p1
  2. 在對其進行評估n(makePoly p1) n
  3. 與第二個相同:(makePoly p2) n
  4. 將它們添加在一起幷包裝在一個lambda中。

這也應該告訴你如何定義add f g

你這裏也有一個問題:

makePoly (PConst n) = \n->n 
        ^

第三n將參照第二n,不是第一n

+0

謝謝!所以也許就像makePoly(PConst x)= \ n-> x? – Aserian

+0

另外,作爲一邊......你知道我怎麼能得到GHCI打印出於測試目的而返回的函數的表示? – Aserian

+0

是的,你對'PConst'情況的修正。由於'n'從未被使用過,所以你也可以寫:'... = \\ _ - > x' – ErikR

相關問題