首页 > 解决方案 > Haskell:不会使用自定义数据类型编译

问题描述

我是haskell的初学者。尝试创建一个程序,允许您输入字符串,然后使用不同的命令对其进行操作。

我已经声明了一个名为 TextEdit 的新类型,我想存储它: - 光标左侧的文本 (l) - 光标右侧的文本 (r) - 光标“选择”的文本 (c) - 以及用于复制/剪切/的剪贴板粘贴

data TextEdit l r c s = TextEdit { left :: l, right :: r, cursor :: c, select :: s }

或者

data TextEdit l r c s = TextEdit { left :: [Char], right :: [Char], cursor :: [Char], select :: [Char]}

到目前为止,我的其余代码如下所示:

main = do
    putStrLn "-----Text Editor-----" 
    putStrLn "Please enter your text"
    tInput <- getLine
    let tI = TextEdit tInput "|" "" ""
    putStrLn "\n\n" 
    putStrLn tInput


moveCursorLeft :: TextEdit -> TextEdit
moveCursorLeft (TextEdit(l, r, c, s)) = (TextEdit(l, r, c, s))

用户将调用“moveCursorLeft tI”来移动光标。

这是我尝试运行它时遇到的错误

TextEditor.hs:20:31: error:
* Expecting four more arguments to `TextEdit'
  Expected a type, but `TextEdit' has kind `* -> * -> * -> * -> *'
* In the type signature: moveCursorLeft :: TextEdit -> TextEdit
   |
20 | moveCursorLeft :: TextEdit -> TextEdit
   |                               ^^^^^^^^

感谢您的帮助:) 真的很感激

标签: haskell

解决方案


data TextEdit l r c s = TextEdit { left   :: l, right  :: r
                                 , cursor :: c, select :: s }

接受 4 个类型参数的类型构造函数也是如此TextEdit,例如TextEdit String String String String,它是一个有效类型。您还有一个同名的数据构造函数,TextEdit "a" "b" "c" "d"它将是 type 的有效值TextEdit String String String String

data TextEdit l r c s = TextEdit { left   :: [Char], right  :: [Char]
                                 , cursor :: [Char], select :: [Char]}

这有点不同,可能不是您想要的。这里TextEdit仍然是一个类型构造函数,但参数没有出现在右侧 - 它们是幻影。相反,您如何使用:

data TextEdit = TextEdit { left   :: [Char], right  :: [Char]
                         , cursor :: [Char], select :: [Char]}

展望未来,我们将使用这个定义。NowTextEdit不是类型构造函数,而只是类型

moveCursorLeft :: TextEdit -> TextEdit
moveCursorLeft (TextEdit(l, r, c, s)) = (TextEdit(l, r, c, s))

啊不。你TextEdit在例行程序中使用正确,main但似乎忘记了你所学的内容。 TextEdit (l,r,c,s)表示文本编辑函数采用一个参数,即 4 元组值。但是,查看我们知道的数据声明TextEdit需要 4 个参数,它们都不是[Char]元组。所以使用TextEdit l r c s. 函数定义也是如此,产生:

moveCursorLeft :: TextEdit -> TextEdit
moveCursorLeft (TextEdit l r c s) = TextEdit l r c s

重申: (a,b,c,d)是一个值 - 一个元组。 是应用于那个值 F (a,b,c,d)的一些构造函数。是应用于四个值的构造函数。函数应用程序使用空格而不是带逗号的括号 - 放弃 C 语法。FF a b c dF


推荐阅读