哈斯克尔,再次。非法类型? [关闭]

Posted

技术标签:

【中文标题】哈斯克尔,再次。非法类型? [关闭]【英文标题】:Haskell, again. Illegal types? [closed] 【发布时间】:2016-02-16 07:33:46 【问题描述】:

我只是发布代码和编译错误。

module Mov where
import Data.List
import System.IO

mov = do putStr motion

motion :: [Char] -> [Int, Int] -> [Int, Int]
motion [] c ≃ c
motion (i : it) c = if i == 'L' || i == 'l' then putStr ((head c) +1, tail c) : motion it
else if i == 'U' || i == 'u' then putStr (head c, ((tail c) + 1)) : motion 
else if i == 'R' || i == 'r' then putStr (((head c) + 1), tail c) : motion 
else if i == 'D' || i == 'd' then putStr ((head c), ((tail c) - 1)) : motion it
 else "instrução invalida" putStr c

还有编译错误:

mov.hs:10:19:
Illegal type: ‘'[Int, Int]’ Perhaps you intended to use DataKinds

mov.hs:10:33:
Illegal type: ‘'[Int, Int]’ Perhaps you intended to use DataKinds

【问题讨论】:

这段代码在很多方面都是错误的——请开始阅读一些基本的haskell语法——比如learnyouahaskell.com [Int,Int] 不能存在 - 也许你的意思是 (Int,Int)putStr 期望 String 作为输入 我尝试了一个元组 (Int, Int),我得到了相同类型的编译错误。 a) 请有礼貌,b) 如果您在论坛上发帖,请尝试写一个有意义的问题 - 您的帖子不包含您已经研究或工作过的信息 @baitillus:你的代码(态度)在很多层面上都是错误的,我真的不知道从哪里开始......但无论如何:它说[Int, Int] 是非法类型,这就是编译错误的全部——[Int, Int] 类型是无意义的;当然,您没有提供有关此代码打算做什么的任何见解,也没有提供您可能认为此错误意味着什么,这将有助于您了解您的想法和您的经验水平等,以帮助其他人帮助您。 【参考方案1】:

我不知道这段代码应该实现什么,所以很难朝着正确的方向纠正它。在问题中,您应该说明您的目标,以便提供一些背景信息。

我将直接指出代码中的一些错误。

motion :: [Char] -> [Int, Int] -> [Int, Int]

[Int, Int] 不是类型。如果你想要一个整数列表,只需使用[Int];如果一对正好是两个整数,使用(Int, Int)

motion [] c ≃ c

应该是 =。 ( 是怎么到达那里的?)

motion (i : it) c = if i == 'L' || i == 'l' then putStr ((head c) +1, tail c) : motion it
else if i == 'U' || i == 'u' then putStr (head c, ((tail c) + 1)) : motion 
else if i == 'R' || i == 'r' then putStr (((head c) + 1), tail c) : motion 
else if i == 'D' || i == 'd' then putStr ((head c), ((tail c) - 1)) : motion it
 else "instrução invalida" putStr c

首先,缩进很重要。 elses 应该比 motion ... 缩进更多。

其次,你不能在纯函数中使用putStr——除非你返回一个IO类型,否则不允许有副作用。

第三个tail c + 1 没有意义:列表的尾部是一个列表,而不是一个数字,所以你不能+1 那个。

第四,我会使用error "instrução invalida"的错误情况。

第五,有时你会递归调用motion而不带参数。

此外,在

mov = do putStr motion

你不能打印一个函数:为此提供一些参数。

【讨论】:

mov = putStr . motion 也有意义。 @TheodoreLiefGannon 不幸的是 motion 需要两个参数,所以它不起作用:-( 啊,错过了。不过,只提供一个参数仍然可以工作:mov xs = putStr . motion xs。当然,总是有mov = (putStr .) . motion 但是......是的,嗯。 ;) 所有那些嵌套的 if 真的很需要守卫。 @user3237465,我错过了这样一个事实,即替代方案是相同字母的不同大小写。我会打破案例并使用模式匹配。

以上是关于哈斯克尔,再次。非法类型? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

哪种最大选择算法更快? (哈斯克尔)[重复]

哈斯克尔背包

使用scanl时空间泄漏在哪里? (哈斯克尔)

`ghc-pkg` 和 `cabal` 程序有啥关系? (哈斯克尔)

哈斯克尔。我很困惑这个代码片段是如何工作的

Java非法启动类型)预期[关闭]