저는 Haskell을 처음 접했고 Where vs. Let에 대해 매우 혼란 스럽습니다 . 둘 다 비슷한 목적을 제공하는 것 같습니다. Where 와 Let 사이의 몇 가지 비교를 읽었 지만 언제 각각을 사용해야하는지 구분하는 데 어려움이 있습니다. 누군가가 컨텍스트를 제공하거나 다른 것을 사용할 때를 보여주는 몇 가지 예를 제공 할 수 있습니까?
어디 대하자
where
절은 함수 정의의 수준에서 정의 할 수 있습니다. 일반적으로let
정의 범위와 동일합니다 . 유일한 차이점은 가드를 사용할 때 입니다.where
절의 범위는 모든 가드에 걸쳐 있습니다. 반대로let
표현식 의 범위 는 현재 함수 절 및 가드 (있는 경우)뿐입니다.
하스켈 위키는 매우 상세하고 다양한 사례를 제공하지만 가상의 예를 사용합니다. 초보자에게는 설명이 너무 짧습니다.
Let의 장점 :
f :: State s a
f = State $ \x -> y
where y = ... x ...
where는 f = 일치하는 패턴을 나타내므로 작동하지 않습니다. 여기서 x는 범위에 없습니다. 반대로 let으로 시작했다면 문제가 없을 것입니다.
f :: State s a
f = State $ \x ->
let y = ... x ...
in y
Where의 장점 :
f x
| cond1 x = a
| cond2 x = g a
| otherwise = f (h x a)
where
a = w x
f x
= let a = w x
in case () of
_ | cond1 x = a
| cond2 x = g a
| otherwise = f (h x a)
Haskell wiki는 Where 절이 선언적이지만 Let 표현식은 표현 적이 라고 언급합니다 . 스타일 외에도 어떻게 다르게 수행합니까?
Declaration style | Expression-style
--------------------------------------+---------------------------------------------
where clause | let expression
arguments LHS: f x = x*x | Lambda abstraction: f = \x -> x*x
Pattern matching: f [] = 0 | case expression: f xs = case xs of [] -> 0
Guards: f [x] | x>0 = 'a' | if expression: f [x] = if x>0 then 'a' else ...
- 첫 번째 예에서 Let 은 범위에 있지만 어디에 있지 않습니까?
- 첫 번째 예에 Where 를 적용 할 수 있습니까 ?
- 변수가 실제 표현을 나타내는 실제 예제에 이것을 적용 할 수 있습니까?
- 각각을 사용할 때 따라야 할 일반적인 경험 법칙이 있습니까?
최신 정보
나중에이 스레드에서 오는 사람들을 위해 여기에서 찾을 수있는 최상의 설명을 찾았습니다 : " A Gentle Introduction to Haskell ".
식하자.
Haskell의 let 표현식은 중첩 된 바인딩 세트가 필요할 때 유용합니다. 간단한 예로서 다음을 고려하십시오.
let y = a*b f x = (x+y)/y in f c + f d
let 표현식에 의해 생성 된 바인딩 세트는 상호 재귀 적이며 패턴 바인딩은 지연 패턴으로 처리됩니다 (즉, 암시 적 ~을 전달 함). 허용되는 유일한 선언 유형은 형식 서명, 함수 바인딩 및 패턴 바인딩입니다.
Where 절.
때로는 where 절이 필요한 여러 보호 방정식에 대해 바인딩 범위를 지정하는 것이 편리합니다.
f x y | y>z = ... | y==z = ... | y<z = ... where z = x*x
이 작업은 포함하는 표현식에 대해서만 범위를 지정하는 let 표현식으로는 수행 할 수 없습니다. where 절은 방정식 또는 케이스 표현식 세트의 최상위 레벨에서만 허용됩니다. let 식의 바인딩에 대한 동일한 속성 및 제약 조건이 where 절의 바인딩에 적용됩니다. 이 두 가지 형태의 중첩 범위는 매우 비슷해 보이지만 let 표현식은 표현식 인 반면 where 절은 그렇지 않습니다. 함수 선언 및 케이스 표현식 구문의 일부입니다.
f = body where x = xbody; y = ybody ...
수단f = let x = xbody; y = ybody ... in body
case .... of ... where
어떻게 든 let 식을 식으로 변환 할 수 있습니까? 이것에 대해 잘 모르겠습니다.
let
와 의 차이에 의아해했습니다where
. 나는 그것을 이해하는 가장 좋은 방법은 둘 사이에 거의 차이가 없기 때문에 걱정할 것이 없다는 것을 깨닫는 것이라고 생각합니다. 매우 간단한 기계적 변형where
을let
통해 주어진 의미 . 참조 haskell.org/onlinereport/decls.html#sect4.4.3.2 이 변환은 표기 편의를 위해 존재하는 정말.