Haskell:不使用自定义数据类型进行编译

时间:2018-05-02 14:27:11

标签: haskell

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

我已经宣布了一个名为TextEdit的新类型,我想要存储它:   - 光标左侧的文字(l)   - 光标右侧(r)  -Text'选择'通过光标(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))

用户将致电&#39; moveCursorLeft tI&#39;移动光标。

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

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

感谢任何帮助人:)真的很感激

1 个答案:

答案 0 :(得分:3)

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

所以TextEdit是一个带有4个类型参数的类型构造函数,例如TextEdit String String String String是一个有效的类型。您还有一个同名的数据构造函数,TextEdit "a" "b" "c" "d"将是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]}

继续前进,我们将使用此定义。现在TextEdit不是类型构造函数,但它只是类型

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)是应用于该值的一些构造函数FF a b c d是应用于四个值的构造函数F。函数应用程序使用空格而不是括号括号 - 删除C语法。

相关问题