2

Haskellのタプルは似ていると思います

  tuple :: (a,b)

つまり、a と b は同じ型でも異なる型でもかまいません。

したがって、タイプを指定せずに関数を定義すると、ghciで:t関数を書くと、おそらく(t、t1)またはいくつかの異なるタイプが得られます。関数で定義せずに同じ型のみを取得することは可能ですか。Haskellでは許可されていないと聞きました

だから私はいくつかの関数を書くことができません

  function [(x,x)]=[(x,x,x)]

を取得するには

  :t function
     function :: [(a,a)]->[(a,a,a)]

これは私が行おうとしている演習であり、この演習では、型を定義せずに関数を作成する必要があります。たとえば、取得するには

  Bool->(Char,Bool) 

私が与えるとき

  :t function

ghciで。書くべきだった--

  function True=('A',True)

関数の型部分を定義することは許可されていないので、書くことはできません

  function::(Eq a)=>[(a,a)]->[(a,a,a)]

またはそのようなもの

4

6 に答える 6

6

Preludeの関数を使用してasTypeOf、タプルの 2 番目のコンポーネントの型を最初のコンポーネントの型と同じに制限することができます。たとえば、GHCi では次のようになります。

> let f (x, y) = (x, y `asTypeOf` x, x)

> :t f
f :: (t, t) -> (t, t, t)
于 2013-05-16T11:37:56.137 に答える
4

必要な型を書き出すことで、型が同等になるように喜んで制限できます。

type Pair a = (a,a)
type Triple a = (a,a,a)

その後:

fn :: [Pair a] -> [Triple a]

必要な制約を強制します。

于 2013-05-16T10:56:43.277 に答える
2

あなたが探しているのはasTypeOf機能だと思います。これを使用すると、ある値の型を関数定義内の別の値の型と同じになるように制限できます。例えば:

Prelude> :t \(a, b) -> (a, b `asTypeOf` a)
\(a, b) -> (a, b `asTypeOf` a) :: (t, t) -> (t, t)
于 2013-05-16T11:37:21.340 に答える
2

typeドンが言うように、使用できます。または、それを気にしたくない場合 (おそらく 1 つの関数に対してのみ必要な場合)、関数の型シグネチャを次のように指定できます。

function :: [(a,a)] -> [(a,a,a)]
function xs = map (\(a, b) -> (a, b, a)) xs -- just an example
于 2013-05-16T11:26:08.057 に答える