我的目标是替换像
这样的签名execute :: [Instruction] -> State -> Pointer -> State
与
execute :: Program -> State
我创建了类型同义词
type Program = [Instruction] -> State -> Pointer
当我定义实现时(例如execute [] s _ = s
),我收到以下编译错误:
Couldn't match expected type ‘State -> Pointer -> State’
with actual type ‘[Int]’
The equation(s) for ‘execute’ have three arguments,
but its type ‘Program -> State’ has only one
如果不将[Instruction] -> State -> Pointer
替换为Program
,则会进行编译。它似乎试图将Program
类型与第一个参数匹配。有没有办法在前三个参数上匹配Program
类型?
答案 0 :(得分:3)
你的类型同义词实际上是一个函数类型(2个参数,未经证实)。所以,当你有一个功能
fun :: Programm -> State
fun p = ...
p
是一个需要2个参数的函数,即一个[Instruction]
和一个State
来生成Pointer
。但是你只能获得功能,而不是所需的指令和状态。 (并且没有指针,只有这可以从指令和状态计算,但是为什么将它作为原始函数的参数...)
你似乎想要的是将三个参数打包成一个。因此元组是好的:
type Program = ([Instruction], State, Pointer)
或使用记录语法:
data Program = Program {
instructionsOf :: [Instruction],
stateOf :: State,
pointerOf :: Pointer }
然后你的代码更接近英语:
fun :: Program -> State
fun program = run (instructionsOf program) -- or whatever