0
ネストされたタプルを返すことになっている関数に苦労しています。具体的には、関数の型付けによって多くの問題が生じています。簡略化バージョンは、以下である:タプル型の再利用
tupfnc :: ?????
tupfnc [a] = (a,())
tupfnc (a:as) = (a,tupfnc as)
考え項目のリスト([0,1,5,3]と言う)と、このようなタプルに入れ子にそれらを取り込むことである:(0、(1、 (5、(3、()))))。
私のinital考えはそうのような宣言で行くことにした。
tupfnc :: [a] -> (a,b)
は、しかし、(この例の)3行目は、エラー
Solver.hs:56:17: error:
• Couldn't match expected type ‘(a, b)’
with actual type ‘[(a, (a, b0))]’
• In the expression: [(a, tupfnc as)]
In an equation for ‘tupfnc’: tupfnc (a : as) = [(a, tupfnc as)]
• Relevant bindings include
as :: [a]
a :: a
tupfnc :: [a] -> (a, b)
任意の提案スロー?
がここにいくつかオフがあります。まず、あなたの "配列"(リスト)は常に_same_タイプを含みます。 '' a''は '' Int''ではないので、 '[0,1、 'a'、3]'は使えません。次に、リストやタプルを返しますが、その型は異なりますので、どちらもできません。そして最後に、 '(a、b)'と '(a、(a、b)) 'という型は' b〜(a、b) 'を除いて異なります。 'InPair a = Stop | 'を使う必要があります。 InPair a(InPair a) 'を作成すると、リストに戻ります。タイプレベルの不均一リストを探していますか? – Zeta
私の悪い、私の頭は質問を書くときに真っ直ぐではなかった。私はそれをより正確に編集しました。リストのアイテムはすべて同じタイプであるとみなされます。 b〜(a、b)についてのあなたのコメントは、私が探していた場所のほうが多かったです。私は、無限型を返す関数を定義する方法を知らない(それらは何と呼ばれているのだろうか?)。また、タイプレベルの不均一リストも見ていきます。 –
編集しても '(a、())'と '[(a、...)]を返します。あなたはリストやタプルを返しますが、それらは異なるタイプです。これはXY問題のようです。あなたは実際に何をしたいですか? – Zeta