haskell - 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
| ^^^^^^^^
感谢您的帮助:) 真的很感激
解决方案
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 语法。F
F a b c d
F
推荐阅读
- javascript - 如何修复移动设备上不可点击的 YT 播放按钮?
- haskell - DeriveAnyClass 与空实例
- windows - 是否可以从批处理文件中获取运行批处理文件的任务计划程序任务的名称?
- sql-server - sys.databases 从存储过程查询时返回不同的结果
- python - 在 pythonanywhere 中托管时找不到引导 CSS
- c# - 如何从 azure blob 存储访问图像
- node.js - Node JS如何使用父ID构建嵌套对象
- r - 这两个反应式数据帧是动态的。但是输出正在合并
- html - 使用 table-header-group 重复用于媒体打印的表头
- angular - 不过滤怎么办