Haskell acemi: Veri decl. hatalar

Merhaba Haskell'de çok basit bir işlev yazmaya çalışıyorum. Ancak kodumu kabul etmek için "ghci" yi alamıyorum.

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))

Ve aldığım hata şudur:

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))

Birisi bana doğru yönde işaret edebilir mi?

Teşekkürler!

0

3 cevap

Son hatta baktığımızda:

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.

İşlev uygulamasının işleçlerden daha yüksek bir önceliği vardır, bu nedenle yukarıdaki satır şunlara eşdeğerdir:

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.


Muhtemelen yapmak istediğiniz, Alan 'un listesini ( [Field] tipine sahip) oluşturup bunu FieldList ' e çevirmektir. . İşte bazı saplama kodu:

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

uHelper :: Int -> [Field]
uHelper = ... -- write this function
2
katma
Evet. Bu benim amacım. Herkese yardımları için teşekkürler!
katma yazar dirtdog, kaynak

Hata diyor (FL [t]): (u (n - 1)) List konsolu üzerinde çalıştığınızı söylüyor. Bir liste olmayan FL [t] , bununla cons yapamazsınız.

Bir alan listesi oluşturduğunuzdan, bir FieldList'in bir alan listesi ya da bir dizge (Name kurucu kullanılarak oluşturulan) olmasını sağlayan yeni bir veri türü olarak neden oluşturduğunuzu bilmiyorum. mantıklı mantıklı.

Yapabilecekleriniz FieldList'i şöyle yapmak:

type FieldList = [Field]

Ve sonra senin işlevin olur:

u :: Int -> FieldList
u 0 = []
u n = t : (u (n-1))
1
katma

Kodunuzda iki sorun var:

  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.

Son sıranın olmasını istiyorsun

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

Elbette alan listesi bir İsim ise, desen eşleşmesi başarısız olur, bu yüzden Ankur ile tasarımda bir sorun olabileceğine katılıyorum ...

0
katma