0
所以我想用关联列表(或地图)构建一个函数表。我做了一些简单的测试,发现以下内容:完全执行curried的函数可以正常工作,但部分curried函数不能存储在关联列表中。下面是正常工作的代码:关联列表中的部分咖喱函数(地图)
import Data.List
import System.IO
func1 :: IO()
func1 = putStrLn "1"
func2 :: IO()
func2 = putStrLn "2"
funcTable = [ (1, func1)
, (2, func2)]
callFunc :: Int -> IO()
callFunc i = do
let justFunc = lookup i funcTable
case justFunc of
Just func -> func
Nothing -> putStrLn "Wrong!"
main = do
callFunc 1
callFunc 2
callFunc 3
但是,下面的代码不会编译:
import Data.List
import System.IO
func1 :: IO()
func1 = putStrLn "1"
func2 :: String -> IO()
func2 s = putStrLn s
funcTable = [ (1, func1)
, (2, func2)]
callFunc :: Int -> IO()
callFunc i = do
let justFunc = lookup i funcTable
case justFunc of
Just func1 -> func1
Just func2 -> func2 "OK"
Nothing -> putStrLn "Wrong!"
main = do
callFunc 1
callFunc 2
callFunc 3
我在不编译代码所做的唯一的变化是我改变FUNC2到部分咖喱功能。任何诡计,使其工作?
问题不在于“部分curried”函数不能存储在“关联”列表中。问题是这两个函数没有相同的类型。此外,在'case'中,'Just func1'不会检查函数是否确实是'func1',在这种情况下'func1'是一个*局部变量*。 –
如果您的'callFunc'函数无论如何都必须知道所有函数,那么保留字典有什么意义? –
尝试写入'funcTable'的类型。你会发现它是生病的输入。 – chi