FieldList u 0 = FL [] u n"> FieldList u 0 = FL [] u n"> FieldList u 0 = FL [] u n" />

ハスケル初心者:データを宣言します。エラー

こんにちは私はHaskellで非常に簡単な関数を書こうとしています。しかし、私のコードを受け入れるために "ghci"を得ることはできません。

data Field = A1 Int deriving (Show)

data FieldList = FL [Field] | Name String deriving (Show)

t :: Field

t = A1 1

u :: Int -> FieldList

u 0 = FL []

u n = FL [t]:(u (n-1))

そして私が得るエラーはこれです:

test.hs:9:7:

Couldn't match expected type `FieldList' with actual type `[a0]'

    In the expression: (FL [t]) : (u (n - 1))
    In an equation for `u': u n = (FL [t]) : (u (n - 1))

誰かが私を正しい方向に向けることができますか?

ありがとう!

0

3 答え

最後の行を見る:

u n = FL [t]:(u (n-1))

u has the type Int -> FieldList. n is an Int, so (n - 1) is also an Int. u (n-1) would therefor be a FieldList.

関数アプリケーションは演算子よりも優先順位が高いため、上記の行は次の行と同等です。

u n = (FL [t]) : (u (n - 1) )

FL [t] is a FieldList.

However, (:) has the type a -> [a] -> [a]. You can see the types don't match, so that is what is causing the problem.


おそらく、 Field (タイプ [Field] )のリストを構築し、それを FieldList 。いくつかのスタブコードがあります:

u :: Int -> FieldList
u n = FL (uHelper n)

uHelper :: Int -> [Field]
uHelper = ... -- write this function
2
追加された
うんそれが私の意図です。みんな助けてくれてありがとう!
追加された 著者 dirtdog,

エラーは、あなたがList cons関数をonにしようとしていることを示す(FL [t]):(u(n-1)) FL [t] はリストではないので、それを cons することはできません。

FieldListをField of ListまたはNameコンストラクタを使用して作成した文字列のいずれかにすることができる新しいデータ型として FieldList を作成した理由がわかりません。論理的な意味をなす。

あなたができることはFieldListを次のようにすることです:

type FieldList = [Field]

そしてあなたの機能は次のようになります:

u :: Int -> FieldList
u 0 = []
u n = t : (u (n-1))
1
追加された

あなたのコードには2つの問題があります:

  1. The first argument of list cons (:) is an element, not a list, thus: t : ... not [t] : ...
  2. You must unwrap the FieldList first to get [Field]. Then you can prepend t to it.

最後の行を

u n = case u (n-1) of FL xx -> FL (t:xx)

フィールドリストが Name の場合、パターンマッチングは失敗しますので、Ankurに同意しますと、デザインに問題がある可能性があります...

0
追加された