哈斯克尔,再次。非法类型? [关闭]
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
首先,缩进很重要。 else
s 应该比 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,我错过了这样一个事实,即替代方案是相同字母的不同大小写。我会打破案例并使用模式匹配。以上是关于哈斯克尔,再次。非法类型? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章