2016-02-05 81 views
1

在F#中我可以這樣定義:如何用Haskell中的初始條件編寫遞歸函數?

let rec sum = function 
| [] -> 0 
| x::xs -> x + sum xs 

看起來很方便。 Haskell中是否有對應關係?

+0

'let sum [] = 0; sum(x:xs)= x + sum xs'(GHCi definition dialect)。 – Mephy

+3

對於這類問題,我推薦[Haskell for OCaml程序員](http://science.raphael.poss.name/haskell-for-ocaml-programmers.html#straightforward-equivalences)(即使我不完全同意所有建議)。 – chi

回答

3
sum :: [Int] -> Int 

sum [] = 0 
sum (x:xs) = x + sum xs 

另一種方式

Prelude>:{ 
Prelude|let sumE xs' = case xs' of 
Prelude|      [] -> 0 
Prelude|      x:xs' -> x + sumE xs' 
Prelude| 
Prelude|:} 
Prelude> sumE [1,2,3] 
6 
Prelude> sumE [] 
0 
+1

Prelude似乎禁止使用多行每次輸入「enter」,表達式就會被評估,你的例子是如何工作的?謝謝。 –

+0

:set + m for multiline mode – user338519

7

假設你喜歡的功能是「我沒有重複的名字sum」,該LambdaCase擴展允許這樣的:

{-# LANGUAGE LambdaCase #-} 

module CaseExample where 
import Prelude hiding (sum) 

sum = \case 
    [] -> 0 
    x:xs -> x + sum xs 

否則,沒有擴展工作的語法是

sum [] = 0 
sum (x:xs) = x + sum xs 
+0

我嘗試了第一個關於ghc的語法錯誤:let sum = \ case [] - > 0 x:xs-> x + sum xs sum [1..10]。它說輸入'case'解析錯誤 –

+0

@vik:您需要在ghci中允許擴展名爲「LambdaCase」。在輸入'let sum = ...'之前,你應該輸入ghci':set -XLambdaCase'。看[這裏](http://stackoverflow.com/questions/12584884/how-do-i-enable-language-extensions-from-within-ghci)。 – isanco

+0

謝謝,它在ghci中有效。但是如果我想用GHC編譯我的代碼,我該如何導入?我試過「導入LambdaCase」,仍然說「解析錯誤輸入'case'。我使用錯誤導入嗎? –

1

這將alow你寫的多行代碼:

Prelude> :set +m 

那就試試這個代碼。提示從前奏>改變爲前奏| :

Prelude> let sumE xs' = case xs' of 
Prelude|      [] -> 0 
Prelude|      x:xs' -> x + sumE xs'