2016-09-25 6 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? 

私はmyOtherFunctionへのMyFunctionの結果を渡すようにした場合は、Haskellでは標準的な方法は何ですか?

私は変数に頼っているので、「x」を渡すことは私に浮気のように思えますか?

+5

これは完全にOKです。 'let x ='は割り当てではなく、不正行為はありません(あなたはハスケルで騙されません)。 –

+0

@ n.m。あなたの名前に「安全でない」機能を使用すると、うんざりすることができます。 – immibis

+0

@immibis彼らはおそらくハスケルではありません...実際には、あなたは 'seq'と違った方法でチートすることができます。 –

答えて

4

、ローカル変数を定義するには、2つの通常の方法があります。

  1. レットに

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

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

を結合彼らは非常にシンプルで自然言語と一致しています。インデントに注意するように気をつけてください。

+1

No.3:関数のパラメータ – Bergi

2

変数に依存することは悪いことではありません。値の名前を宣言すると、コードがわかりやすくなります(「x」よりわかりやすい名前を使用すると)。

あなたはもちろん、同様point-free styleであなたの関数を作成することができます

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

do表記は、命令型プログラミングのようにと思われますが、純粋に関数式の構文上の砂糖です。この場合、let「ステートメント」は、式の残りを本文として持つ通常のlet式の開始点に過ぎません。

このような短い表現で
main = do let x = myFunction myList 
      in print $ myOtherFunction x 

、あなたは、単にmyListで呼び出さ一つの機能にすべての3つの機能を構成する場合があります

main = print . myOtherFunction . myFunction $ myList 
関連する問題