0

私はHaskellで次の操作を実行しようとしている:ハスケルでガードを使って可能ですか?

someFunction :: [] -> Int 
someFunction list 
let a 
| length list == 1 = 10 
| otherwise = 0 
b 
| length list == 1 = 10 
| otherwise = 0 
in findValues (a+b) 

とbの値に達するかいないされている警備員の状況に依存するようにします。この構文は私にエラーを与え続けて、私はなぜそれがわからないのですか? where句を使用する必要がありますか、または私が欲しいものを達成するための正しいlet構文がありますか?

任意のヘルプ

+1

なぜ、 'let a = length list == 1ならば10 else else'と書いてください。 – Bergi

答えて

5

のおかげでそれは言うのは少し難しいですが、私はあなたがこれはなんとかですが、length list == 1は非常に非効率的であることを心に留めておく

someFunction :: [] -> Int 
someFunction list = 
    let a | length list == 1 = 10 
     | otherwise = 0 
     b | length list == 1 = 10 
     | otherwise = 0 
    in findValues (a+b) 
8

を意味推測している:それはスキャンされますO(N)時間を費やして1つずつ計算するすべてのエントリ。

代わりに、case .. ofを使用して、一定時間内にそれを確認できます。

someFunction :: [] -> Int 
someFunction list = let 
    a = case list of 
     [_] -> 10 -- list is of the form [x] for some x 
     _ -> 0 -- list is of any other form 
    b = case list of 
     [_] -> 10 
     _ -> 0 
    in findValues (a+b) 

かさえ:私は「可能な場合

someFunction :: [] -> Int 
someFunction list = let 
    (a,b) = case list of 
     [_] -> (10,10) -- list is of the form [x] for some x 
     _ -> (0 ,0) -- list is of any other form 
    in findValues (a+b) 

は(コードは一例故意、またはであるということです?またabが同じ値を持っていることに注意してください) dは、パターンマッチングのために警備員を避けることを強く推奨します。

関連する問題