Haskell #13 (Where!?)

--

이번 챕터에서는 Where라는 문법을 다룹니다.

Ref: Syntax in Functions-Where!?

이전 챕터에서 가드를 사용해서 bmiTell 함수를 구현한 예제입니다. 여기에서 가드들의 뒤에 where라는 키워드를 넣으면 다양한 이름이나 함수들을 정의할 수 있습니다.

bmiTell 함수는 where를 사용하여 다시 작성하였습니다. where에서 선언된 이름들은 가드들의 내부에서 사용될 수 있음을 확인하실 수 있습니다. 이렇게 변경함으로써 우리는 중복된 값을 두번 입력할 필요가없고, 계산식의 변경에도 한번만 변경하여 적용할 수 있습니다. 또한 이름으로 표현함으로써 가독성이 향상되고 bmi가 한번만 계산된다는 점에서 성능도 향상됩니다.

bmiTell내의 where에서 선언된 이름들은 함수 내에서만 사용할 수 있습니다. 따라서 다른 네임스페이스에 영향을 주지 않습니다. 여기서 모든 이름들은 한개의 컬럼에서 정렬되어야 합니다.

where에 선언된 이름은 서로 다른 패턴들끼리는 공유되지 않습니다. 만약 한개의 함수에 있는 여러개의 패턴들이 공유하려면 전역으로 선언해야 합니다.

where에서도 패턴매칭을 통한 바인딩이 가능합니다. 위 예제는 패턴매칭을 사용해서 바인딩하는 것으로 수정한 예제입니다.

이 예제는 성과 이름의 이니셜을 출력하는 함수를 where를 사용해서 구현한 예제입니다. 사실 바로 함수의 파라메터에 패턴매칭을 사용하면 되지만 where를 사용하는 것을 보여주기 위한 예제입니다.

지금까지는 where에 상수를 정의해서 사용했지만, 위 예제와 같이 함수를 정의해서 사용할 수 있습니다. calcBmis 함수는 몸무게와 키쌍들의 리스트를 받아서 bmi의 리스트를 반환하는 함수입니다.

where 바인딩도 중첩이 가능하고, 함수를 만들기 위해 자주 쓰일 수 있습니다. where 절에는 헬퍼 함수를 선언하고, 각 헬퍼함수는 또 자신의 where를 선언하여 사용합니다. (??? 설명이 어렵네요 ㅜㅜ)

--

--