Haskellのスコープがwhere
の定義に問題があります。私は、x
を局所的に定義された関数f1
にパラメータとして明示的に使用することなく渡すために、f
を持っていますが、x
の型がf1
の出力と互換性がないというエラーが表示されます。それは同じであるべきである。入れ子関数定義でのスコープ指定
f :: Eq a => a -> [a] f x = f1 x where f1 :: Eq a => a -> [a] f1 y = [ x, y ]
エラーは以下である:
Couldn't match expected type `a1' against inferred type `a' `a1' is a rigid type variable bound by the type signature for `f1' at test.hs:4:11 `a' is a rigid type variable bound by the type signature for `f' at test.hs:1:8 In the expression: x In the expression: [x, y] In the definition of `f1': f1 y = [x, y] Failed, modules loaded: none.
I機能と、次のコードで行ったように、私はしかし、追加のパラメータとしてx
を渡すと、それが正常に動作します:
g :: Eq a => a -> [a] g x = g1 x x where g1 :: Eq a => a -> a -> [a] g1 x y = [ x, y ]
タイプf1
でタイプa
(またはa1
)と互換性のf
でa
を作るための方法はありますか?
非常に些細な部分を除いて、たくさんの型シグニチャを使用してコードを砂糖処理するのは非常に良い習慣ですが、私はそれらを使って局所的にスコープされた関数を砂糖砕く理由を見ません。型シグネチャが何であるかは明白です。そのような単純な関数の場合、得意先よりも読みやすさが失われます。 – Rayne
実際の機能はより複雑で、私は実際の問題が明らかになるように単純な例に減らしました。 – poke