1

機能があります

sasiad (x,y) = [ (x+dx,y+dy) | dy <- [-1..1], dx <- [-1..1], x+dx >= 0, y+dy >= 0]

その関数のタイプは好きではありません。[(Int,Int)]代わりに返して[(t,t1)] ほしいghciに強制的に作成させることはできますか?

4

2 に答える 2

7

dave4420が言及しているように型注釈を追加できますが、通常の方法は次のとおりです。

sasiad :: (Int, Int) -> [(Int, Int)]
sasiad (x,y) = [ (x+dx,y+dy) | dy <- [-1..1], dx <- [-1..1], x+dx >= 0, y+dy >= 0]

ただし、コンパイラが推測する型を使用するための引数があります。

sasiad :: (Ord t1, Ord t, Num t1, Num t, Enum t, Enum t1) => (t, t1) -> [(t, t1)]

このブログエントリが主張しているように、より複雑なタイプには利点があります。たとえば、関数の推論された型が区別され、この型を宣言した場合、コンパイラが引数を混同させないことを意味しますt。基本的に、このタイプは、結果リストのペアの最初の要素がのみを使用して計算され、2番目の要素がのみをt1使用して計算されることを保証します。これが有用な不変条件であるかどうかは、プログラムによって異なります。xy

また、私はあなたの関数をリファクタリングせざるを得ません:

sasiad :: (Ord t1, Ord t, Num t1, Num t, Enum t, Enum t1) => (t, t1) -> [(t, t1)]
sasiad (x,y) = cross (generate x) (generate y)
    where generate x = filter (>=0) . map (\dx -> x+dx) $ [-1..1]

cross xs ys = [ (x,y) | x <- xs, y <- ys ]
于 2012-06-29T18:10:18.267 に答える
2

はい、タイプアノテーションを追加します:

sasiad (x,y) = [ (x+dx,y+dy) | dy <- [-1..1], dx <- [-1..1], x+dx >= 0, y+dy >= 0] :: [(Int, Int)]
于 2012-06-29T17:31:09.523 に答える