2015-01-25 2 views
5

하스켈에서 시작하기에 단일 조건을 기반으로 여러 변수를 할당하는 가장 좋은 방법을 찾으려고합니다. 지금까지 저는 튜플을 포장하고 풀었습니다. 더/더 관용적 인 방법이 있습니까?하스켈에서 다중 변수 할당하기

(var1, var2, var3) = 
    if foo > 0 
     then ("Foo", "Bar", 3) 
     else ("Bar", "Baz", 1) 

튜플의 포장 및 포장 비용에 관해 궁금한 점이 있습니다. this을 올바르게 읽는다면 함수에서 최적화 된 것처럼 보이지만 할당이있는 경우 확실하지 않은 것 같습니다.

+1

목록을 사용할 수도 있습니다. 'a = 1','b = 2','c :'(a : b : c : rest) = [1,2,3,4,5,6]'을 사용하여 큰 덩어리로 패턴 일치시킬 수도 있습니다. = 3', 나머지는 [4,5,6]이다. 게다가, 이것은 기본 표현 수준이 아니라'let'과'where' 문에서만 필요합니다. – AJFarmar

+9

Haskell에는 _mutable_ 변수가 없기 때문에 "할당"보다는 "바인딩"또는 "정의"라고 부릅니다. 귀하의 코드는 괜찮아 보이는데, 프로파일 링 포인트가 아니라면 비용에 대해 걱정하지 않아도됩니다. 또한이 튜플에 대해 걱정한다면''Bar ''가 런타임에 실제로 어떻게 표현되는지 알고 싶지 않을 것입니다 ;;-) – chi

답변

6

예, 괜찮습니다. 최적화가 활성화 된 상태에서 컴파일하면 튜플은 실제로 "언 박싱"됩니다. 따라서 추가 비용이 들지 않습니다. 코드는 막연하게 이런 식으로 변환됩니다

(# var1, var2, var3 #) = 
    case foo > 0 of 
     False -> (# "Bar", "Baz", 1 #) 
     True -> (# "Foo", "Bar", 3 #) 

언 박싱 3 튜플 실제로 단지 세 개의 값 - 그것 추가 구조의 어떤 종류가 없습니다. 결과적으로 데이터 구조에 저장할 수 없지만 괜찮습니다. 물론 foo이 컴파일 타임에 알려지면 case도 최적화되어 3 개의 정의를 얻을 수 있습니다.