2017-11-16 2 views
3

다양한 양의 매개 변수를 사용하는 함수를 만들려고하고 있지만 F #에 대해 실행 가능한 솔루션을 찾지 못하는 것 같습니다.Fsharp : 함수에 대한 N 매개 변수 전달

let expression = (fun a b -> a || b) 
let expressionTriple = (fun a b c -> (a || b) && c) 

// This doesn't work because expression can either be a function that takes fixed arguments 
let truthTable numPredicates expression = 
    if numPredicates = 2 then 
     expression true true 
    else 
     expression true true false 


truthTable 2 expression 
truthTable 3 expressionTriple 

어떻게 표현식 함수에 다양한 양의 인수를 전달할 수 있습니까?

+0

'진실 표 3 표현'에 무엇을할까요? – Lee

+0

truthTable 3은 전달할 술어의 수를 나타냅니다. – rudresh4

+0

예, 'expression'은 2 개의 인수 만 사용하므로'expression true true false'는 일반적으로 컴파일 오류입니다. – Lee

답변

3

F #에서 다른 서명 (다른 수의 매개 변수 포함)이있는 함수는 고유 한 유형으로 간주됩니다. 그리고 함수에 두 개의 고유 한 유형 (또는 심지어 12 개의 고유 한 유형)이 될 수있는 매개 변수를 가져 오려면 언제든지 discriminated unions을 사용해야합니다. 그냥 차별 노동 조합에 Quad of ('a -> 'a -> 'a -> 'a -> 'a) 케이스를 추가, 당신은 네 개의 파라미터 버전을 추가하고 싶다면

type Expression<'a> = 
    | Double of ('a -> 'a -> 'a) 
    | Triple of ('a -> 'a -> 'a -> 'a) 

let expression = fun a b -> a || b 
let expressionTriple = fun a b c -> (a || b) && c 

// This works because expression is a discriminated union 
let truthTable expression = 
    match expression with 
    | Double f -> f true true 
    | Triple f -> f true true false 

truthTable (Double expression) 
truthTable (Triple expressionTriple) 

: 여기에 컴파일하고 당신이하려는 일을하는 방식으로 코드를 작성할 수있는 방법 , 등등.

bool 대신 generic type 'a으로 작성한 이유에 대해 궁금한 점이 있으면 언제든지 후속 질문을 요청하십시오.

+0

다른 옵션은 오버로드이지만 임의의 진리 테이블을 모델링하기 위해 오버로드를 사용하지 않습니다. 단순히 옳다고 느끼지 않습니다. – Gustavo

+0

이것을 임의 N 매개 변수로 확장하는 방법이 있습니까? 현재 해결 방법은 ParamArray를 사용하는 것입니다. https://github.com/rudresh4/discite/blob/52c95bf507b2b706ffeb24277c384ec57477667e/fsharp/99-problems/48-logical-expression/LogicalExpressionTest.fs#L28 – rudresh4

+0

Github 레포에서 ' 99 개의 문제 세트를 다루고 있는데, 이것은 문제 48입니다. 지금까지이 문제를 보았던 유일한 해결책은 '표현식'을리스트를 취하는 함수로 만드는 것입니다. 예를 들어 http://www.fssnip.net/ar/title/NinetyNine-F-Problems-Problems-46-50-Logic-and-Codes의 문제 문장은 호출 할 수있는 함수'tablen'을 정의하기를 원합니다. 'tablen 3 (fun [a; b; c] -> a && (b || c) = a && b || a && c)'와 같은 형식입니다. 귀하의 'ParamArray' 솔루션은 그렇게 멀리 떨어져 있지 않습니다. – rmunn

2
let expression = (fun [a; b] -> a || b) 
let expressionTriple = (fun [a; b; c] -> (a || b) && c) 

let truthTable numPredicates expression = 
    if numPredicates = 2 then 
     expression [true; true] 
    else 
     expression [true; true; false] 


truthTable 2 expression 
truthTable 3 expressionTriple 
+0

작동하지만 두 개의 첫 번째 줄에서 경고가 생성됩니다. – Soldalma

관련 문제