【问题标题】:Haskell beginner: Data decl. errorsHaskell 初学者:数据声明。错误
【发布时间】:2011-10-28 20:23:55
【问题描述】:

您好,我正在尝试在 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))

有人能指出我正确的方向吗?

谢谢!

【问题讨论】:

    标签: haskell


    【解决方案1】:

    看最后一行:

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

    你的类型为Int -> FieldListnInt,所以 (n - 1) 也是 Intu (n-1) 将因此成为 FieldList

    函数应用的优先级高于运算符,所以上面一行相当于:

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

    FL [t]FieldList

    但是,(:) 的类型为 a -> [a] -> [a]。您可以看到类型不匹配,这就是导致问题的原因。


    您可能想要做的是建立Fields 的列表(类型为[Field]),然后将其转换为FieldList。这是一些存根代码:

    u :: Int -> FieldList
    u n = FL (uHelper n)
    
    uHelper :: Int -> [Field]
    uHelper = ... -- write this function
    

    【讨论】:

    • 是的。这就是我的意图。感谢大家的帮助!
    【解决方案2】:

    错误提示 (FL [t]) : (u (n - 1)) 表示您正在尝试使用 List cons 功能 FL [t] 这不是一个列表,因此您不能 cons 使用它。

    我不知道您为什么创建 FieldList 作为新数据类型,它允许 FieldList 是字段列表或字符串(使用 Name 构造函数创建),这有点不合逻辑感觉。

    您可以将 FieldList 设置为:

    type FieldList = [Field]

    然后你的函数会变成:

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

    【讨论】:

      【解决方案3】:

      你的代码有两个问题:

      1. 列表 cons (:) 的第一个参数是一个元素,而不是一个列表,因此:t : ... 不是 [t] : ...
      2. 您必须先打开FieldList 才能获得[Field]。然后你可以在它前面加上t

      你希望你的最后一行是

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

      如果字段列表是Name,那当然无法进行模式匹配,所以我同意 Ankur 的观点,即设计可能存在问题...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多