하스켈에서 가장 짧은 a-> b-> (a-> b) 함수


19

테스트에서 다음과 같은 질문이 있습니다.

f다음 유형 의 함수 를 작성하십시오 a -> b -> (a -> b). a그리고 b더 나은, 어떤 의미에서 짧은 코드를 결합 할 수 없습니다.

나는 생각해 냈습니다 f a b = \x -> snd ([a,x],b). 더 작은 것을 찾을 수 있습니까?

현재 승자는 다음과 같습니다. f _=(.f).const


보다 일반적인 유형이 허용되는 경우 : f = const const.
hammar

@hammar : 또는 f _ b _ = b이지만 질문에 대한 해결책을 감안할 때 더 일반적인 유형이 허용 되지 않는 것 같습니다 .
Tikhon Jelvis 2012

6
더 일반적인 유형이 허용된다면 왜 그렇지 f = id않습니까?
Tom Ellis

7
사실보다 일반적인 유형이 허용 f = f되면 해결책이되므로 유형의 조건이 매우 중요하다고 생각합니다!
Tom Ellis

2
더 일반적인 유형은 허용되지 않으며 가정은 정확합니다.
Radu Stoenescu

답변:


11

오른쪽에서 익명 함수를 제거하여 예제를 축소 할 수 있습니다.

f a b x = snd ([a,x],b)

유형 a -> b -> a -> ba -> b -> (a -> b)Haskell 과 동일하기 때문에 작동합니다 .


4
약간 더 짧은 수정 :f a b x = snd (f x,b)
Ed'ka

5

이 기능은 f _=(.f).const보다 일반적인 유형 실제로 f :: a -> b -> (a -> b)f :: a -> b -> (c -> b). 형식 시그니처가 제공되지 않으면 형식 유추 시스템은 형식을 유추 f :: a -> b -> (a -> b)하지만 f :: a -> b -> (c -> b)정확히 동일한 정의로 형식 서명을 포함하면 Haskell은 문제없이 컴파일하고 f의 부분 응용 프로그램에 대해 일관된 형식을보고합니다. 이 경우 형식 유추 시스템이 형식 검사 시스템보다 엄격한 몇 가지 깊은 이유가있을 수 있지만 이것이 왜 그런지에 대한 이유를 생각해 낼 충분한 범주 이론을 이해하지 못합니다. 확신이 없으면 직접 시도해보십시오.


의 경우와 같을 수 있습니다 f a b = f a a. 형식 a -> a -> b을 준수하지만 형식 인 것으로 추론 합니다 a -> b -> c. f유형이 제공되지 않으면 단형으로 만 사용할 수 있기 때문 입니다.
proud haskeller

나는 이것이 중요하지 않다고 생각한다
자랑스러운 haskeller

4

주어진 ScopedTypeVariables, 나는 이것을 생각해 냈다 :

f (_::a) b (_::a) = b

내 기능과 네 기능을 모두 줄이면 내 머리카락이 짧아집니다.

f(_::a)b(_::a)=b
f a b x=snd([a,x],b)

물론, 당신은 아마 ScopedTypeVariables: P 에 의존해서는 안됩니다 .


3
이 짧게 아니다 f _=(.f).const( 때문에 Sassa NF로 ). 어느 것도 필요하지 않습니다 ScopedTypeVariables.
반 시계 회전을 중단

흠, 나는 이것이 첫 번째와 세 번째 논쟁이 목록이되어야한다고 생각했다.
Chris Taylor

@ChrisTaylor : 마음에 너무 많은 OCaml? :)
Tikhon Jelvis

아야! ;)
Chris Taylor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.