2016-09-25 30 views
0

我有以下代码:传递方法结果的功能方式?

myFunction :: [Int] -> [Int] 
myFunction (x : xs) = [\x + 1 | x <- xs] 

myList = [1,2,3,4,5] 

myOtherFunction :: [...] 

main = do 
    let x = myFunction myList 
    print $ myOtherFunction x --Is this right for FP? 

如果我是第一个通过的myFunction的进入myOtherFunction的结果,是什么在Haskell的标准呢?

通过'x'在我看来就像作弊,因为我依赖变量?

+5

这是完全确定。 '让x ='不是作业,没有作弊(你不能在Haskell作弊),尽可能多地使用它。 –

+0

@ n.m。那么,如果您在名称中使用任何带有“不安全”功能的功能,您都可以作弊。 – immibis

+0

@immibis他们可以说是不是Haskell ...实际上你可以用'seq'作为一个不同的方式。 –

回答

4

在Haskell中,有两种常用的方法来定义一个局部变量。

  1. 的让 - 在结合

    main = do 
        let x = myFunction myList 
        in print $ myOtherFunction x 
    
  2. where子句

    main = do 
        print $ myOtherFunction x 
        where x = myFunction myList 
    

他们是非常简单和自然语言保持一致。只是重新注意一下注意事项。

+1

3号:函数参数 – Bergi

2

依赖变量并不是一件坏事,声明你的值的名字有助于使代码可读(如果你使用的是比“x”更具描述性的名字)。

你当然也可以写你的函数point-free style还有:

main = print (myOtherFunction (myFunction myList)) 
-- or 
main = print $ myOtherFunction $ myFunction myList 
3

do符号看起来像像命令式编程,但它只是纯函数表达式的语法糖。在这种情况下,let“声明”仅仅是正则表达式的开始,其余do表达式作为正文。

main = do let x = myFunction myList 
      in print $ myOtherFunction x 

在这个简短的表达,你可能想简单地组合这三个功能为号召myList一个功能:

main = print . myOtherFunction . myFunction $ myList