Haskell이 간단한 라이브러리 함수로 정의하는 대신 내장 "if / then / else"를 사용하는 이유는 무엇입니까?


25

Haskell 에 간단한 라이브러리 함수 대신 유형에 if/then/else따라 내장 Bool함수 가있는 이유는 무엇 입니까? 와 같은

if :: Bool -> a -> a -> a
if True  x _ = x
if False _ y = y

4
나는 그들이 agda에서와 같이 mixfix 함수 없이는 얻을 수없는 if / then / else 구문을 분명히 원했을 것입니다. 당신이 참조하는 기능은 삼항으로 구성되어 있습니다. 나는 그들이 우리에게 (그렇다면 설탕 일 것입니다) 설탕을 줄 수 있다고 가정하더라도 스스로 구현할 수 있습니다. 여기에 저를 백업하기 위해, 나는 이것을 주석으로 쓰고 있습니다.
Jimmy Hoffa

10
이것은 대부분의 독자들에게 명백 할 수도 있지만, 함수로 îf / then / else를 갖는 것이 열성적인 언어 (예 : 체계 또는 sml)에서 좋은 해결책은 아니지만 게으른 경우에는 합리적이라고 지적하고 싶습니다. 하스켈 같은 언어.
Giorgio

답변:


24

그것은의 좋은 설탕을 위해 순전히 if, thenelse키워드; 실제로 GHC ( RebindableSyntax확장 기능이 활성화 된)는 ifThenElse범위 내에있는 함수 를 호출하여 구문을 제거합니다 .


6

그것은 중요하지 않습니다 ... 나에게 요즘 / ifn / else가 자주 사용되지 않는 것처럼 보입니다. 나는 if .. then .. else의 패턴 가드를 작성하는 자신을 발견한다.

문법적인 관점에서 볼 때,

if expr1 then expr2 else expr3

그래서 당신은 쓸 수 있습니다

if foo a then bar b else baz c

대신에

if (foo a) (bar b) (baz c)

그것은 나에게 조금 LISPish 보인다.

시맨틱 분석 및 코드 생성을 위해 효율적인 기계 코드로 쉽게 컴파일 할 수있는이 구성을 갖는 것이 좋습니다. 코드는 (평가되지 않은) 매개 변수를 모두 전달해야하는 함수 호출과 달리 도달하지 않은 분기에 대한 썽크를 만드는 부분을 건너 뛸 수 있습니다. 그러나 썽크를 만들려면 시간과 메모리가 필요합니다. 이를 잘 활용하려면 if 함수를 어디에서나 인라인해야합니다.


3
인라인이 실제 문제라고 생각하지 않습니다. 내 이해는 GHC가 이미 Haskell에서 일반적인 패턴이기 때문에 작은 기능을 인라인하는 데 탁월하다는 것입니다.
Tikhon Jelvis

1
@TikhonJelvis 물론이지만 if / then / else를 사용하면 항상 인라인되어야하는 특수 기능이 필요하지 않습니다. 인라인 패스가 필요하지 않지만 여전히 괜찮은 코드를 생성 할 수 있습니다. 모든 세계가 GHC는 아닙니다.
Ingo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.