我是哈斯克尔的初学者。尝试创建一个程序,允许您输入一个字符串,然后使用不同的命令对其进行操作。
我已经宣布了一个名为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
| ^^^^^^^^
感谢任何帮助人:)真的很感激
答案 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)
是应用于该值的一些构造函数F
。 F a b c d
是应用于四个值的构造函数F
。函数应用程序使用空格而不是括号括号 - 删除C语法。