2016-02-05 48 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'