0
   ver :: (Float,Float)->(Float,Float)->(Float,Float)->(Float,Float,Float)
   ver g=sqrt((((fst x -fst y)^2)+((snd x -snd y)^2))) 
   ver g1=sqrt((((fst x -fst z)^2)+((snd x -snd z)^2))) 
   ver g2=sqrt((((fst y -fst z)^2)+((snd y -snd z)^2)))
   ():g++g1++g2

私はこれを書いていますが、エラーが発生し続けています: トップレベルでの裸の表現

私がやりたいことは、3つの建物間の距離を取り、それらをタプルとして提示することです:(dAB,dBC,dAC)

4

4 に答える 4

3

もしかして

ver :: (Float,Float)->(Float,Float)->(Float,Float)->(Float,Float,Float)
ver x y z = (g,g1,g2) where
   g=sqrt((((fst x -fst y)^2)+((snd x -snd y)^2))) 
   g1=sqrt((((fst x -fst z)^2)+((snd x -snd z)^2))) 
   g2=sqrt((((fst y -fst z)^2)+((snd y -snd z)^2)))

コンパイルして与える

> ver (1,1) (4,-3) (8,0)
(5.0,7.071068,5.0)

...引数として与えられた 3 点のペア間の距離の 3 倍 (3 タプル)。

「裸の式」エラーは、関数ではない行に何かがあったことを意味します - あなたの最後の行。代わりにwhere、中間計算を紹介するために使用しましたが、次のように使用することもできますlet ... in ...

ver' :: (Float,Float)->(Float,Float)->(Float,Float)->(Float,Float,Float)
ver' x y z = let
   g=sqrt((((fst x -fst y)^2)+((snd x -snd y)^2))) 
   g1=sqrt((((fst x -fst z)^2)+((snd x -snd z)^2))) 
   g2=sqrt((((fst y -fst z)^2)+((snd y -snd z)^2)))
     in (g,g1,g2)

この表記():g++g1++g2は、タプルとリストの間で少し混乱しているようです。空のリストからリストを構築することはできますが、タプルを構築することはできません。

たとえば、1:3:8:[]which は と同じよう[1,3,8]に実行できますが、 は空のリストではなく空のタプル (型エラー) であるため1:3:8:()に実行できません。その右側にリスト。(つまり、リストの前にすばやく追加できますが、後ろにすばやく追加することはできません。)()[]:1:3:88:

たぶん、チュートリアルに取り組み、すべての演習に答える価値があります。実際の詳細が不足している Haskell でのプログラミングの概念図を持っているようです。Learn You a Haskell for Great Goodは陽気に書かれており、アクセスしやすく、オンラインで無料で読むことができます。実際にすべての演習を行い、答えが機能するかどうかをテストすることを忘れないでください! (ghci またはハグを使用してください。) 定期的なテストとチェックにより、より速く学習できます。

于 2013-09-29T22:26:54.347 に答える
1

コードの問題点とその修正方法のリストを開始する前に、 Learn You a Haskell for Great Good のようなチュートリアルまたは Haskell の紹介テキストを最初に読むことをお勧めします。

まず、あなたが得るエラーはから来ています

 ():g++g1++g2

Haskell では、top level(0 インデント) にあるものは、何らかの種類 (インポート、型シグネチャ) の宣言または関数の実装方法の一部である必要があります。

何かの実装があります (間違っていますが、後で詳しく説明します)。Haskell では、これを表現するためにletorのような特別なキーワードがありますwhere。それらがないため、そのコード行は実装に関係なく失われ、最上位に存在できず、エラーが発生します。すぐにそれを修正する方法を示します。

第二に、その行はあなたが期待することをしません。()は空のタプルを表し、:リスト コンストラクターであり、++リストの追加です。float^3 のタプルを作成するためにはどちらも意味がありません

次のようなものが必要です。

(,,) g g1 g2 
--or
(g,g1,g2)

第 3 に、関数の実装は型の指定とは無関係です。つまり、3 つの引数を持つバージョンのver代わりに の3 つのバージョンがありverます。もう一度自問してみてください。

3 つの引数を持つ関数を定義する場合、関数は次のようになります。

ver x y z = -- Insert the calculations you want.

見る?xyz は関数の入力変数です。左側に置く= ものはすべて入力であり、右側から来るものはすべて出力です。

わかりましたが、g g1 g2 はどうですか? これらの 3 つの値を計算し、名前を付けてから使用したいことをどのように伝えることができますか?

where前に言った節を使う時が来ました。関数がどのように見えるかを見てください。

ver :: (Float,Float)->(Float,Float)->(Float,Float)->(Float,Float,Float)
ver x y z = (g,g1,g2)
     where g=sqrt((((fst x -fst y)^2)+((snd x -snd y)^2))) 
           g1=sqrt((((fst x -fst z)^2)+((snd x -snd z)^2))) 
           g2=sqrt((((fst y -fst z)^2)+((snd y -snd z)^2)))

また、where を ver と同じレベルに置くと、where がどの関数に属しているかを表現していないため、インデントに注意してください。

于 2013-09-29T22:37:00.773 に答える
0

次のように、3 つのタプルすべてを個別にパターン マッチさせたいと考えています。

type Location = (Float, Float)
ver :: Location -> Location -> Location -> (Float, Float, Float)
ver (aX, aY) (bX, bY) (cX, cY) = (0, 0, 0) {- Your logic -}

これにより、3 つの場所すべて、IE x,y タプルにアクセスできるようになります。

これに対処するためのより良い方法として。たとえば、関数を再考して Location の配列を変換し、距離の配列を返すことができます。これにより、よりエレガントなソリューションを書くことができます

于 2013-09-29T22:26:01.570 に答える
0

問題は最後の行にあります: ():g++g1++g2. それが裸の表現です。ファイルの最上位には、 のような定義ver g=sqrt((((fst x -fst y)^2)+((snd x -snd y)^2)))または型の注釈のみを含めることができますver :: (Float,Float)->(Float,Float)->(Float,Float)->(Float,Float,Float)。解析エラーを取り除くには、ファイルから最後の行を削除するだけです。

ただし、解析エラーを取り除いた後ver、注釈で述べたものと一致しないタイプに関する別のエラーが発生します。これは、コードが何をするかについて誤解があるかどうかを明確にするため、あなたが行ったように明示的な型注釈を作成するための非常に良い議論です。verあなたの場合、関数は引数を一度に1行ずつ取ると思うようですが、これは正しくありません。現状では、 の型は であるver必要がありますt -> Double。これは、型注釈をコメントアウトし、関数を ghci にロードして と入力することで確認できます:t ver。これにより、Haskell が認識する型が得られます。

先に進むための最も簡単な方法は、実際の例を示すことだと思います。

cityA = (3,4)
cityB = (1,2)
cityC = (6,3)

dist :: (Double, Double) -> (Double, Double) -> Double
dist city1 city2 = sqrt((fst city1 - fst city2)^2 + (snd city1 - snd city2)^2)

tripleDist :: (Double, Double) -> (Double, Double) -> (Double, Double) -> (Double, Double, Double)
tripleDist city1 city2 city3 = (d12, d13, d23)
    where d12 = dist city1 city2
          d13 = dist city1 city3
          d23 = dist city2 city3

dists = tripleDist cityA cityB cityC

これが役立つことを願っています。

于 2013-09-29T22:26:20.083 に答える