在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