機能があります
sasiad (x,y) = [ (x+dx,y+dy) | dy <- [-1..1], dx <- [-1..1], x+dx >= 0, y+dy >= 0]
その関数のタイプは好きではありません。[(Int,Int)]
代わりに返して[(t,t1)]
ほしいghciに強制的に作成させることはできますか?
機能があります
sasiad (x,y) = [ (x+dx,y+dy) | dy <- [-1..1], dx <- [-1..1], x+dx >= 0, y+dy >= 0]
その関数のタイプは好きではありません。[(Int,Int)]
代わりに返して[(t,t1)]
ほしいghciに強制的に作成させることはできますか?
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
使用して計算されることを保証します。これが有用な不変条件であるかどうかは、プログラムによって異なります。x
y
また、私はあなたの関数をリファクタリングせざるを得ません:
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 ]
はい、タイプアノテーションを追加します:
sasiad (x,y) = [ (x+dx,y+dy) | dy <- [-1..1], dx <- [-1..1], x+dx >= 0, y+dy >= 0] :: [(Int, Int)]