2017-01-20 2 views
0

하스켈에서 이진 검색 트리로 작업하고 있습니다. 여기 하스켈 함수에서 인수를 정의하는 올바른 방법은 무엇입니까

그래서 기본적으로 코드의이 작품은 BST의 요소를 삽입하고 두 번째 인수는 괄호 (예 : insert 5 (Node Leaf 2 Leaf))를 내부에 고정되어있는 경우는 잘 작동하지만 위해 내가

data BinaryTree a = Leaf | Node (BinaryTree a) a (BinaryTree a) 
deriving (Show, Eq) 
    insert :: (Ord a, Eq a) => a -> BinaryTree a -> BinaryTree a 
    insert e (Leaf)= (Node Leaf e Leaf) 
    insert e (Node n1 a n2) 
     | e<a=(Node (insert e n1) a n2) 
     | otherwise = (Node n1 a (insert e n2)) 

을 쓴 코드 내가 원하는 것을 얻으려면 둘 다 안쪽 괄호 안의 두 번째 인수가 아닌 경우 (예 : insert 5 Node Leaf 2 Leaf) 이 코드를 다시 작성할 수있는 방법에 대해 조언 해 줄 수 있습니까? 상기 설명 된대로

+0

여기 청소처럼 보이는 것입니다 : http://pastebin.com/vpNKvDW7 –

+1

나는 당신이 실제로 5 노드 잎 2 '전화를 삽입 할 _need_ 생각하지 않는다 잎은 괄호없이. 이것은 나에게 XY 문제로 보입니다. 완전히 다른 것을 필요로하지만 괄호 만 언급 한 것처럼 말입니다. 실제로 그걸로 무엇을 이루고자합니까? – chi

답변

6

insert 5 Node Leaf 2 Leafinsert은 두 개의 인수가 아니라 다섯 개의 인수를 사용합니다. 이 작업을 원하면 유일한 방법은 insert을 5 개의 인수를 취하도록 정의하는 것입니다.

insert 5 Node Leaf 2 Leafinsert 5 (Node Leaf 2 Leaf)을 모두 만들 수있는 방법이 없으며 더 작거나 큰 나무로 5 인자 버전을 사용할 수있는 방법이 없으므로 그다지 의미가 없습니다. 괄호를 피하려면

, 당신은 단지 대신 $을 사용할 수

insert 5 $ Node Leaf 2 Leaf 
1

난 당신이 불가능하다 싶은 느낌이 듭니다. 괄호를 사용하면 삽입 유형이 insert::a -> BinaryTree a -> BinaryTree a (명확성을 위해 생략되었습니다)입니다. 그러나 괄호를 사용하지 않으면 유형이 다음과 같이됩니다. insert::a -> (BinaryTree a -> a -> BinaryTree a -> BinaryTree a) -> BinaryTree a -> a -> BinaryTree a -> BinaryTree a

그러나 더 가까워지기 위해 내가 제안 할 수있는 몇 가지 옵션이 있습니다.

첫째, 낮은 우선 순위 응용 프로그램 운영자 $

insert 5 $ Node Leaf 2 Leaf 

둘째를 사용하여, 당신은 절 let, 또는 where을 사용하여 새 하위 트리를 결합 할 수

let t = Node Leaf 2 Leaf 
in insert 5 t 

또는

insert 5 t 
    where t = Node Leaf 2 Leaf 

셋째, 인수 생성자가 있지만 다시 괄호 또는 $이 필요합니다. 코드에서 몇 가지 여분의 괄호가 있습니다

node n = Node Leaf n Leaf 
--One of the following 
insert 5 . node $ 2 
(insert 5 . node) 2 
insert 5 (node 2)