使用多个包含的类型定义Haskell类型

时间:2015-07-18 00:58:45

标签: haskell types

我的目标是替换像

这样的签名
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类型?

1 个答案:

答案 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