在F#中我可以這樣定義:如何用Haskell中的初始條件編寫遞歸函數?
let rec sum = function
| [] -> 0
| x::xs -> x + sum xs
看起來很方便。 Haskell中是否有對應關係?
在F#中我可以這樣定義:如何用Haskell中的初始條件編寫遞歸函數?
let rec sum = function
| [] -> 0
| x::xs -> x + sum xs
看起來很方便。 Haskell中是否有對應關係?
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
Prelude似乎禁止使用多行每次輸入「enter」,表達式就會被評估,你的例子是如何工作的?謝謝。 –
:set + m for multiline mode – user338519
假設你喜歡的功能是「我沒有重複的名字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
我嘗試了第一個關於ghc的語法錯誤:let sum = \ case [] - > 0 x:xs-> x + sum xs sum [1..10]。它說輸入'case'解析錯誤 –
@vik:您需要在ghci中允許擴展名爲「LambdaCase」。在輸入'let sum = ...'之前,你應該輸入ghci':set -XLambdaCase'。看[這裏](http://stackoverflow.com/questions/12584884/how-do-i-enable-language-extensions-from-within-ghci)。 – isanco
謝謝,它在ghci中有效。但是如果我想用GHC編譯我的代碼,我該如何導入?我試過「導入LambdaCase」,仍然說「解析錯誤輸入'case'。我使用錯誤導入嗎? –
這將alow你寫的多行代碼:
Prelude> :set +m
那就試試這個代碼。提示從前奏>改變爲前奏| :
Prelude> let sumE xs' = case xs' of
Prelude| [] -> 0
Prelude| x:xs' -> x + sumE xs'
'let sum [] = 0; sum(x:xs)= x + sum xs'(GHCi definition dialect)。 – Mephy
對於這類問題,我推薦[Haskell for OCaml程序員](http://science.raphael.poss.name/haskell-for-ocaml-programmers.html#straightforward-equivalences)(即使我不完全同意所有建議)。 – chi