gpt4 book ai didi

haskell - 我需要什么类型的签名才能将函数列表转换为 Haskell 代码?

转载 作者:行者123 更新时间:2023-12-01 06:55:44 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




9年前关闭。




Possible Duplicate:
Why is such a function definition not allowed in haskell?



我做了一个名为 funlist 的haskell 函数。它的作用是获取一个起始值和一个函数列表,并将列表中的所有函数应用于起始值。
funlist thing [function] = function thing
funlist thing (function:functions) = funlist (function thing) functions
funlist _ _ = error "need a list of functions"

这个函数的问题在于它的类型是 funlist :: t -> [t -> t] -> t 。该类型意味着虽然 ghc 将允许不将起始值转换为完全不同类型的函数列表(例如 [sin,cos,tan] 将被允许),但将起始值转换为不同类型(例如 show )的函数将生成一个错误,因为该函数与类型签名不匹配。

这不是函数应该如何工作。它应该能够获取更改起始值类型的函数列表(例如 [sin,show] )。这个函数基本上将 funlist 5 [sin,cos,tan,isInfinite,show] 转换为 show $ isInfinite $ tan $ cos $ sin $ 5 ,虽然后者有效,但前者无效。

有什么办法可以让这个功能正常工作吗?

编辑: 我知道 .>>> ,我只是想知道是否有办法使这项工作。

最佳答案

你可以用 GADT 写你想要的东西:

{-# LANGUAGE GADTs #-}
module Funlist where

data F x y where
Id :: F a a
Ap :: (a->b) -> F b c -> F a c

-- A very round about way to write f x = x + x

f1 :: Int -> Char
f1 = toEnum

f2 :: Char -> String
f2 x = x:x:[]

f3 :: String -> [Int]
f3 = map fromEnum

f4 :: [Int] -> Integer
f4 = foldr (+) 0 . map toInteger

f_list :: F Int Integer
f_list = Ap f1 (Ap f2 (Ap f3 (Ap f4 Id)))

ap :: F a b -> a -> b
ap Id x = x
ap (Ap f gs) x = ap gs (f x)

现在 ap f_list 65130

关于haskell - 我需要什么类型的签名才能将函数列表转换为 Haskell 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11548711/

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