1에서 MAGIC_NUMBER까지 숫자 목록을 가지고 있다고 가정 해 봅시다. 미리 선언 할 수있는 방법이 있습니까?마법의 숫자를 피하기 위해 상수를 어떻게 사용합니까?
23
A
답변
13
당신이 "마법"숫자 대수 값을 렌더링하고 모든 계산에 대수 데이터를 사용하고 정말 "마법"경우 일부라는 이름의 값을 사용하거나 구축 할 수 있습니다 더 많은 :
class FlagsMask f where mask :: f -> Int
data Magics = Alpha | Beta | Gamma
deriving (Enum, Read, Show, Eq, Ord)
instance FlagsMask Magics where
mask m = 2^fromEnum m
data PermsFlag = FlagRead | FlagWrite | FlagExec | FlagSuper
-- [flagRead, flagWrite, flagExec] = [2^n | n <- [0..2]]
(flagRead : flagWrite : flagExec : _) = [2^n | n <- [0..]]
flagSuper = 16
instance FlagsMask PermsFlag where
mask FlagRead = flagRead
mask FlagWrite = flagWrite
mask FlagExec = flagExec
mask FlagSuper = flagSuper
*Main> map fromEnum [Alpha .. ] [0,1,2] it :: [Int] *Main> zip [Alpha .. ] [1..] [(Alpha,1),(Beta,2),(Gamma,3)] it :: [(Magics, Integer)]
45
물론입니다. 사실, Haskell이 순전히 기능적이라는 점을 감안할 때, 상수를 정의하는 것이 아닌 상수를 정의하는 것이 훨씬 쉽습니다.
magicNumber = 42
magicList = [1..magicNumber]
35
척의 답변은 정확합니다. 두 번째 줄에서 magicNum
단지 f x = 'A'
처럼, 모든 일치하는 패턴입니다 -
magicNum = 42
f magicNum = 'A'
f _ = 'B'
당신이 기대하는 것이 아니다 : 당신이 알아야 할 하나 개의 함정이있다. f x | x == magicNum = 'A'
을 사용하십시오.
+1
사실, 표준 연산자를 이런 식으로 다시 바인딩 할 수도 있습니다. 예를 들어,'f (==) a b = a == b' 함수를 정의한 다음'f div 8 4'를 호출하면 결과는 false가 아니라 2가됩니다. (물론 이것은 병적 인 일입니다.) – Chuck
관련 문제
- 1. DTO, 어떻게 그들을 피하기 위해?
- 2. 플러그인 충돌을 피하기 위해 jQuery noconflict를 사용합니까?
- 3. RNG에서 시드가 아닌 숫자를 어떻게 사용합니까?
- 4. 마법 숫자를 담고있는 화면 차원 상수를 리팩토링해야합니까?
- 5. 구두점 처리시 마술 문자열이나 상수를 사용합니까?
- 6. 상수를 정의하기 위해 만든 매크로입니까?
- 7. System.Web 참조를 피하기 위해 반사
- 8. 이중 게시를 피하기 위해 리디렉션됩니까?
- 9. 관련없는 레코드를 찾기 위해 ActiveRecord를 어떻게 사용합니까?
- 10. 프레임에서 Javascript를 실행하기 위해 Selenium을 어떻게 사용합니까?
- 11. 리디렉션을 정의하기 위해 PHP 예외를 어떻게 사용합니까?
- 12. SSMA 타임 스탬프. 무엇을 위해, 어떻게 사용합니까?
- 13. 양식을 ajaxify하기 위해 jQuery를 어떻게 사용합니까?
- 14. 마법의 줌 플러스
- 15. 어떻게 SQL 주입을 피하기 위해 PHP에서 데이터를 살균합니까?
- 16. 어떻게 활동 안드로이드 사이 빈 화면을 피하기 위해?
- 17. 어떻게 파이어 월 프레이밍 배경 이미지를 피하기 위해?
- 18. 정의되지 않은 오프셋을 피하기 위해 PHP에서 배열의 기본값을 어떻게 정의합니까?
- 19. 어떻게 nginx "업스트림 너무 큰 헤더"오류를 피하기 위해?
- 20. 해킹을 피하기 위해 ASP 페이지를 코딩하는 것
- 21. C에서 문자열 상수를 어떻게 선언합니까?
- 22. GDB에서 #define 상수를 어떻게 인쇄합니까?
- 23. PLT Scheme에서 상수를 어떻게 정의합니까?
- 24. 이적 레일 협회와 마법의 수를
- 25. Python - 향후 계산을 피하기 위해 속성 캐쉬
- 26. 중복 코드를 피하기 위해 리 팩터링
- 27. ZF에서 "글로벌"구성을 어떻게 사용합니까?
- 28. linq 오류를 피하기 위해 "EnforceConstraints"하는 방법?
- 29. commandLink 작업을 위해 별도의 함수 피하기
- 30. 충돌을 피하기 위해 중도에 NSXML 다운로드를 중단하십시오
"선언 번호"란 무엇입니까? – ony
당신이 분명히해야 할 매우 중요한 포인트 : 언제 마법의 번호를 알고 있습니까? 컴파일 시간에 그것을 안다면 척은 아래에서 올바른 대답을 가지고 있습니다. –