gpt4 book ai didi

haskell - haskell 中的多态函数列表?

转载 作者:行者123 更新时间:2023-12-05 00:19:23 26 4
gpt4 key购买 nike

考虑下面的代码:

t1 :: [Int] -> (Int,String)
t1 xs = (sum xs,show $ length xs)

t2 :: [Int] -> (Int,String)
t2 xs = (length xs, (\x -> '?') <$> xs)

t3 :: [Int] -> (Char,String)
t3 (x:xs) = ('Y',"1+" ++ (show $ length xs))
t3 [] = ('N',"empty")

这三个函数的类型只是部分变化——它们完全可用,而无需知道它们生成的元组的第一个组件的类型。这意味着我可以对它们进行操作而无需引用该类型:
fnListToStrs vs fs = (\x -> snd $ x vs) <$> fs

将这些定义加载到 GHCi 中,所有三个函数都作为 fnListToStrs 的参数独立工作。 ,实际上我可以传入一个包含 t1 和 t2 的列表,因为它们具有相同的类型:
*Imprec> fnListToStrs [1,2] [t1,t2]
["2","??"]
*Imprec> fnListToStrs [1,2] [t3]
["1+1"]

但是我不能同时通过所有 3 个,即使类型的分歧实际上与执行的计算无关:
*Imprec> fnListToStrs [1,2] [t1,t2]
["2","??"]
*Imprec> fnListToStrs [1,2] [t3]
["1+1"]

我有一种感觉,使这项工作与存在或不可预测类型有关,但是在使用我希望 fnListToStrs 能够采用的类型声明时,这两种扩展都对我不起作用,即:
fnListToStrs :: [Int] -> [forall a.[Int]->(a,String)] -> [String]

有没有其他方法可以使这项工作?

最佳答案

存在是正确的,而不是无谓的。并且 Haskell 没有存在性,除非通过显式包装器......

{-# LANGUAGE GADTs #-}

data SomeFstRes x z where
SFR :: (x -> (y,z)) -> SomeFstRes x z

> fmap (\(SFR f) -> snd $ f [1,2]) [SFR t1, SFR t2, SFR t3]
["2","??","1+1"]

但是,这真的有点没用。因为无论如何你不可能对第一个结果做任何事情,所以立即扔掉它并将剩余的函数放在一个简单的单态列表中更明智:
> fmap ($[1,2]) [snd . t1, snd . t2, snd . t3]
["2","??","1+1"]

关于haskell - haskell 中的多态函数列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36164398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com