2017-01-20 17 views
0

私はHaskellでバイナリ検索ツリーを使っています。Haskell関数で引数を定義する正しい方法は何ですか

ここで私はそう基本的に、コードのこの作品は、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)) 

を書きましたが、順番にコードがあります私が望むものを得るためには、私のプログラムが両方の場合に働く必要があります。内側のかっこ内の2番目の引数とそうでないときがあります(insert 5 Node Leaf 2 Leaf) 何かを得るためにこのコードを書き直す方法について助言できますか?上記のとおりです

+0

は、ここではクリーンアップのように見えるものです:http://pastebin.com/vpNKvDW7 –

+1

私はあなたが実際に5ノードの葉2 'を呼び出す挿入するために_必要_とは思いません括弧なしの「葉」。これは私にとってXYの問題に見えます。まるであなたがまったく違う何かを必要としているかのように、かっこだけを言います。あなたは実際にそれを達成しようとしていますか? – chi

答えて

6

insert 5 Node Leaf 2 Leafは01を呼び出しますは、2つではなく5つの引数を持つ関数です。これを有効にするには、唯一の方法は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 

第2の低優先順位のアプリケーションの演算子を使用し、あなたはletを使用して、新しいサブツリーを結合し、またはwhere

let t = Node Leaf 2 Leaf 
in insert 5 t 

または

かもしれません
insert 5 t 
    where t = Node Leaf 2 Leaf 

第3に、引数のコンストラクタが返されますが、これにはかっこまたは$が必要です。あなたのコード内のいくつかの余分な括弧があり

node n = Node Leaf n Leaf 
--One of the following 
insert 5 . node $ 2 
(insert 5 . node) 2 
insert 5 (node 2) 
関連する問題